最近在面試中被問到了幾個有關sizeof的問題,自我感覺都回答對了,不過回來實際編寫代碼試了一下,發現還是錯了一個地方,於是總結了一下。
棧中的數組
對於棧中的數組,sizeof給出的會是實際的數組長度,而非指針長度。
#include <string.h> #include <stdio.h> int main() { char a[5]= "blue"; char b[ ] = "blue"; char c[6] = "blue"; printf("sizeof(a): %d\n", sizeof(a)); printf("sizeof(b): %d\n", sizeof(b)); printf("sizeof(c): %d\n", sizeof(c)); return 0; }
sizeof(b): 5
sizeof(c): 6
指向數組的指針
當是一個指向數組(堆中,棧中或數據區的數組)的指針變量時,sizeof的結果將會是一個指針變量的長度,比如在32位機下將會是4.
#include <string.h> #include <stdio.h> #include <stdlib.h> int main() { char ca[ ] = "blue1"; char *a = "blue1"; char *b = (char *)malloc(6 * sizeof(char)); char *c = ca; strcpy("blue1", b); printf("sizeof(a): %d\n", sizeof(a)); printf("sizeof(b): %d\n", sizeof(b)); printf("sizeof(c): %c\n", sizeof(c)); free(b); return 0; }
sizeof(b): 4
sizeof(c): 4
全局變量
對於全局變量中數組,sizeof的處理結果和在棧中的數組一樣,會輸出其實際的數組長度,而非一個指針變量的長度。對於全局變量中的指向數組的指針sizeof的處理方式爲返回一個指針變量的長度。
#include <string.h> #include <stdio.h> char a[5]= "blue"; char b[ ] = "blue"; char c[6] = "blue"; char *d = "blue"; char *e = a; int main() { printf("sizeof(a): %d\n", sizeof(a)); printf("sizeof(b): %d\n", sizeof(b)); printf("sizeof(c): %d\n", sizeof(c)); printf("sizeof(d): %d\n", sizeof(d)); printf("sizeof(e): %d\n", sizeof(e)); return 0; }
sizeof(b): 5
sizeof(c): 6
sizeof(d): 4
sizeof(e): 4
函數參數
對於函數參數,無論是寫成數組形式還是指針形式,sizeof都只會返回一個指針變量的長度。
#include <stdio.h> void printsize1(char argv[]) { printf("%d\n", sizeof(argv)); } void printsize2(char *argv) { printf("%d\n", sizeof(argv)); } int main() { char a[] = "blue1"; char *b = "blue1"; printf("printsize1(a): "); printsize1(a); printf("printsize2(a): "); printsize2(a); printf("printsize1(b): "); printsize1(b); printf("printsize2(b): "); printsize2(b); return 0; }
printsize2(a): 4
printsize1(b): 4
printsize2(b): 4