簡體   English   中英

為什么大小不一樣? 數組的 sizeof(a) vs sizeof(&a)?

[英]Why the size differs? sizeof(a) vs sizeof(&a) of an array?

對於下面的代碼。

int a[4];
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));

output 是

16
8

'a' 代表整個數組(也是數組的第一個元素的地址,因為它是一維數組),sizeof(a) 代表整個數組的大小。 因此大小是 16。明白了。

'&a' 代表整個數組的地址,而sizeof(&a) 代表什么?

我猜它的 output 是 8 因為該值是一個地址並計算固定指針的大小? 因此 8. 我是對的嗎?

但是我還是沒搞清楚。 任何人都可以幫忙給出一個明確的解釋嗎?

因為,它們的類型不同,並且sizeof運算符對類型進行操作。

首先, sizeof運算符產生size_t類型的結果。 您應該使用%zu格式說明符來打印結果。

也就是說,在這種情況下, a是數組(這是一個特定的用例,其中數組不會“衰減”),因此,它將大小計算為元素數量乘以每個元素的大小。 在您的情況下, int的大小應該是4 ,因此您得到4*4 , 16 為了便於理解,以下打印語句類似:

printf("%zu\n",sizeof(a));
printf("%zu\n",sizeof(int[4])); // same as above

另一方面, &a表示數組的地址,該地址是一個指針,類型為int (*)[4] 同樣,您的系統似乎使用 8 個字節作為指針大小,因此是 output。 為了比較,我們可以寫

printf("%zu\n",sizeof(&a));
printf("%zu\n",sizeof(int(*)[4])); // same as above

表達式&a返回一個指向a的指針。

系統中指針的大小為8字節。

我猜它的 output 是 8 因為該值是一個地址並計算固定指針的大小? 因此 8. 我是對的嗎?

是的 -表達式&a產生一個指向a的指針,它的類型為int (*)[4] (指向int的 4 元素數組的指針)。 在您的系統上,該指針類型為 8 個字節寬。

所以,

sizeof a  == sizeof (int [4])    == 16
sizeof &a == sizeof (int (*)[4]) == 8
sizeof *a == sizeof a[0] == sizeof (int) == 4

不同的指針類型可能有不同的大小,但在大多數桌面和服務器系統上,所有 object 指針的大小都相同(4 或 8 字節,具體取決於架構)。

旁注: sizeof運算符,而不是 function - 僅當操作數是類型名稱時才需要括號。 sizeof (a)而不是sizeof a並沒有什么壞處,我知道這里有些人推薦它,但我個人傾向於不這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM