sizeof( )是一個編譯時期的運算子,而非執行時期的運算子,所以當你程式編譯完成時,其值就已經決定了。
CPU/ OS 32-Bits
int gIntArray[10]; char gCharArray[10]; void main(void) { printf("sizeof(gIntArray): %d", sizeof(gIntArray)); // 10 * 4 bytes printf("sizeof(gIntArray)/sizeof(gIntArray[0]): %d", sizeof(gIntArray)/sizeof(gIntArray[0])); // 10 printf("sizeof(gIntArray)/sizeof(int): %d", sizeof(gIntArray)/sizeof(int)); // 10 printf("sizeof(gCharArray): %d", sizeof(gCharArray)); // 10 * 1 bytes printf("sizeof(gCharArray)/sizeof(gCharArray[0]): %d", sizeof(gCharArray)/sizeof(gCharArray[0])); // 10 printf("sizeof(gCharArray)/sizeof(char): %d", sizeof(gCharArray)/sizeof(char)); // 10 }
陣列大小的計算僅適用於靜態陣列,若是當成參數傳給 Function,Function收到的只是一個指標
CPU/ OS 32-Bits
int gIntArray[10]; char gCharArray[10]; void main(void) { function(gIntArray, gCharArray); } void function (int intArray[], char charArray[]) { printf("sizeof(intArray): %d", sizeof(intArray)); // pointer 4 bytes printf("sizeof(intArray)/sizeof(intArray[0]): %d", sizeof(intArray)/sizeof(intArray[0])); // 1 = (pointer 4 bytes) / (int 4 bytes) printf("sizeof(intArray)/sizeof(int): %d", sizeof(intArray)/sizeof(int)); // 1 = (pointer 4 bytes) / (int 4 bytes) printf("sizeof(charArray): %d", sizeof(charArray)); // pointer 4 bytes printf("sizeof(charArray)/sizeof(charArray[0]): %d", sizeof(charArray)/sizeof(charArray[0])); // 4 = (pointer 4 bytes) / (char 1 byte) printf("sizeof(charArray)/sizeof(char): %d", sizeof(charArray)/sizeof(char)); // 4 = (pointer 4 bytes) / (char 1 byte) }
CPU/ OS 64-Bits
int gIntArray[10]; char gCharArray[10]; void main(void) { function(gIntArray, gCharArray); } void function (int intArray[], char charArray[]) { printf("sizeof(intArray)/sizeof(intArray[0]): %d", sizeof(intArray)/sizeof(intArray[0])); // 2 = (pointer 8 bytes) / (int 4 bytes) printf("sizeof(charArray)/sizeof(charArray[0]): %d", sizeof(charArray)/sizeof(charArray[0])); // 8 = (pointer 8 bytes) / (char 1 byte) }
所以並無法計算陣列的大小,一般解決的辦法是在呼叫前先計算好陣列大小,然後當成參數一併傳給 Function
CPU, OS 32-Bits
int gInitArray[10]; char gCharArray[10] void main(void) { function(gIntArray, sizeof(gIntArray)/sizeof(gIntArray[0])); } void function (int intArray[], int length) { printf("size of intArray: %d", length * sizeof(intArray[0])); // 10 * 4 bytes }