sizeof函數的結果:
- 變量:變量所占的位元組數。
int i = 0; printf("%d\n", sizeof(i)); //4
- 數組:數組所占的位元組數。
int arr_int1[] = {1,2,3,4,5}; int arr_int2[10] = {1,2,3,4,5}; printf("size_arr1=%d\n",sizeof(arr_int1)); //5*4=20 printf("size_arr2=%d\n",sizeof(arr_int2)); //10*4=40
- 字元串:其實就是加了\'\0\'的字元數組。結果為字元串字元長度+1。
char str[] = "str"; printf("size_str=%d\n",sizeof(str)); //3+1=4
- 指針:固定長度:4(32位位址環境)。
- 特殊說明:數組作為函數的入口參數時,在函數中對數組sizeof,獲得的結果固定為4:因為傳入的參數是一個指針。
int Get_Size(int arr[]) { return sizeof(arr); } int main() { int arr_int[10] = {1,2,3,4,5}; printf("size_fun_arr=%d\n",Get_Size(arr_int)); //4 }
- 特殊說明:數組作為函數的入口參數時,在函數中對數組sizeof,獲得的結果固定為4:因為傳入的參數是一個指針。
- 結構體
- 隻含變量的結構體:
- 結果是最寬變量所占位元組數的整數倍:[4 1 x x x]
typedef struct test { int i; char ch; }test_t; printf("size_test=%d\n", sizeof(test_t)); //8
- 幾個寬度較小的變量可以填充在一個寬度範圍内:[4 2 1 1]
typedef struct test { int i; short s; char ch1; char ch2; }test_t; printf("size_test=%d\n", sizeof(test_t)); //8
- 位址對齊:結構體成員的偏移量必須是其自身寬度的整數倍:[4 1 x 2 1 x x x]
typedef struct test { int i; char ch1; short s; char ch2; }test_t; printf("size_test=%d\n", sizeof(test_t)); //12
- 結果是最寬變量所占位元組數的整數倍:[4 1 x x x]
- 含數組的結構體:包含整個數組的寬度。數組寬度上文已詳述。[4*10 2 1 1]
typedef struct test { int i[10]; short s; char ch1; char ch2; }test_t; printf("size_test=%d\n", sizeof(test_t)); //44
- 嵌套結構體的結構體
- 包含整個内部結構體的寬度(即整個展開的内部結構體):[4 4 4]
typedef struct son { int name; int birthday; }son_t; typedef struct father { son_t s1; int wife; }father_t; printf("size_struct=%d\n",sizeof(father_t)); //12
- 位址對齊:被展開的内部結構體的首個成員的偏移量,必須是被展開的内部結構體中最寬變量所占位元組的整數倍:[2 x x 2 x x 4 4 4]
typedef struct son { short age; int name; int birthday; }son_t; typedef struct father { short age; son_t s1; int wife; }father_t; printf("size_struct=%d\n",sizeof(father_t)); //20
- 包含整個内部結構體的寬度(即整個展開的内部結構體):[4 4 4]
- 隻含變量的結構體: