天天看點

C語言中的sizeof函數總結

sizeof函數的結果:

  1. 變量:變量所占的位元組數。
    int i = 0;
    printf("%d\n", sizeof(i));    //4      
  2. 數組:數組所占的位元組數。
    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      
  3. 字元串:其實就是加了\'\0\'的字元數組。結果為字元串字元長度+1。
    char str[] = "str";
    printf("size_str=%d\n",sizeof(str));    //3+1=4      
  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
      }      
  5. 結構體
    1. 隻含變量的結構體:
      1. 結果是最寬變量所占位元組數的整數倍:[4 1 x x x]
        typedef struct test {
            int i;
            char ch;
        }test_t;
        printf("size_test=%d\n", sizeof(test_t));    //8      
      2. 幾個寬度較小的變量可以填充在一個寬度範圍内:[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      
      3. 位址對齊:結構體成員的偏移量必須是其自身寬度的整數倍:[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      
    2. 含數組的結構體:包含整個數組的寬度。數組寬度上文已詳述。[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      
    3. 嵌套結構體的結構體
      1. 包含整個内部結構體的寬度(即整個展開的内部結構體):[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. 位址對齊:被展開的内部結構體的首個成員的偏移量,必須是被展開的内部結構體中最寬變量所占位元組的整數倍:[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      
C語言中的sizeof函數總結