c/c++ sizeof(陣列名) 的解析 sizeof如何計算陣列大小
按照傳統,先給結論:sizeof(陣列名) 的值是這個陣列所佔據的記憶體的大小,單位是位元組(bytes),在32位機器上,假設一個int型的陣列a,裡面一共有10個int型別元素,那麼sizeof(a)的值就是10 * 4 = 40
原文連結:點選開啟
sizeof是如何計算陣列大小的
char *ptr;
char arr[10];
sizeof(ptr) =4;
sizeof(arr) =10;請問是如何計算陣列大小的?這裡只是把地址傳給sizeof啊
嚴格講,
sizeof(arr) =10; 這裡只是把地址傳給sizeof啊
你這句話是錯誤的,你傳的是陣列名,陣列名不等價於地址。
編譯器用陣列名標記陣列的屬性,比如具有確定數量的元素。
而你說的地址,也就是指標,只是一個標量值。
只有當陣列名在表示式中使用時,編譯器才會為它產生一個指標常量。而只有以下兩種情況,才不被當做指標常量:
-
sizeof(陣列名):返回陣列長度(所佔的位元組數,不是陣列元素個數),而不是指向陣列的指標的長度。
-
&陣列名:產生一個指向陣列的指標,而不是一個指向某個指標常量的指標。
以上內容來源:《C和指標》P141~142
sizeof(arr)這行不是程式執行到這裡的時候才去求值的。所以不是你想的‘光憑指標如何知道陣列長度’。
並且sizeof(arr)計算的陣列所佔位元組數,並非陣列長度,陣列長度=sizeof(arr)/sizeof(char)
sizeof是關鍵字,是在編譯階段處理的。也就是說你程式沒有執行前,sizeof(arr)就被替換成了一個固定的常量,儲存在了test.out中了。你可以試試這樣寫 sizeof ptr
也是不會報錯的,這說明了sizeof不是函式。
你想驗證的話可以分階段編譯,看下處理結果:
1.原始檔:
#include<stdio.h>
int main(){
int a[10];
int b = sizeof a;
}
2.編譯結果test.s
執行gcc -S test.c
你會發現編譯階段這裡已經計算出了陣列a的大小:40.
注意,這裡的陣列長度 = sizeof(a)/sizeof(int) = 40/4 = 10