天天看點

sizeof 運算所得的值是在編譯時還是運作時确定?

《C語言程式設計》中對sizeof的描述:C語言提供了一個編譯時(compile-time) 一進制運算符 sizeof,它可以用來計算任一對象的長度。 表達式sizeof 對象以及sizeof(類型名)将傳回一個整型值,它等于指定對象或類型占用的存儲空間位元組數。

依據上述描述,可以得出結論sizeof的值是在編譯時确定的,而非運作期确定。

如一下舉例代碼:

// 需在C99标準的編譯器下編譯, ANSI C (即C89)下編譯不通過
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
 int n;
 scanf("%d",&n);
 int arr[n];
 printf("%d\n",sizeof(n++));
 printf("%d\n",sizeof(arr));
 printf("%d",n);
 return 0;
}
           

上述代碼開始輸入3 給 n

輸出結果為: 4 12 3

即sizeof(n++)中的++未執行,(在sizeof後使用函數,同樣在求函數傳回值大小時,函數也不會執行)但sizeof(arr) 一定不是在編譯時确定的。 不同的輸入得到動态數組大小不一。

在c99沒有出現之前,sizeof是由編譯時确定的,sizeof對一個類型求出的值可以當一個常量來用。但C99中引入了動态數組(定義一個數組,其大小由運作時确定)導緻sizeof作用于動态數組時的值不再是常量。

結論

sizeof是一種運算符不是函數,所得出的值在編譯期确定,可以求出靜态配置設定記憶體的數組的長度,但不能求出動态配置設定的記憶體的大小。

繼續閱讀