1. 程式人生 > >c/c++ sizeof(陣列名) 的解析 sizeof如何計算陣列大小

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