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