[英]How array is initialized with the the help of sizeof operator?
#include <stdio.h>
#include <stdarg.h>
int main()
{
int x,y;
y = sizeof(int[]){0,1,2,3,4} ;
x = y / sizeof(1);
printf("Number of arguments: %d", x);
return 0;
}
此代碼給出了編號。 數組中存在的變量數。 (請參見變量y
)如何初始化此數組? 我認為數組是這樣初始化的: int a[]={variables}
。 如果還有更多初始化數組的方法,請提及。
該代碼使用復合文字來具有“內聯”(匿名)數組。
由於該數組僅與sizeof
,因此不會構造或初始化實際的運行時數組,因此,所有這些工作都由編譯器在編譯時完成,只需檢查代碼並確定其類型即可。
快速推銷給我們:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], edi
mov QWORD PTR [rbp-32], rsi
mov DWORD PTR [rbp-4], 20 # Load 'y' with 20 (size of 5 ints)
mov eax, DWORD PTR [rbp-4]
cdqe
shr rax, 2 # Divide by four, giving 5.
mov DWORD PTR [rbp-8], eax
mov eax, DWORD PTR [rbp-8]
pop rbp
ret
順便說一句:您在使用括號時前后不一致; 除非參數是類型名稱,否則sizeof
不需要使用它們,因此第二種用法可能只是
x = y / sizeof 1;
這兩個通常是結合在一起的,但是這里不可能,因為您的數組是匿名的。
(int[]){0,1,2,3,4
是構造數組的復合文字 (在C99中引入)。 這只是在運行中簡單地構造一個數組。
n1570-§6.5.2.5/ p3:
由括號類型名稱和括號括起來的初始化程序列表組成的后綴表達式是復合文字。 它提供了一個未命名的對象,其值由初始化程序列表提供。 99)
sizeof (int[]){0,1,2,3,4}
給出數組(int[]){0,1,2,3,4}
的大小,以字節為單位。 sizeof (1)
給出int
的大小,因此y/ sizeof (1)
給出數組中元素的數量。
在此聲明中
y=sizeof (int[]){0,1,2,3,4} ;
有兩件事。 第一個是使用類型為int[5]
復合文字int[]){0,1,2,3,4}
。 它是一個未命名的整數數組。 使用了用於從初始化程序數量中獲取元素數量的復合文字。 考慮到兩個數組都不創建,因為sizeof
運算符不計算表達式。 它只是確定其類型。
實際上,這句話等同於
y = sizeof( int[5] );
使用復合文字只允許編譯器本身計算數組中元素的數量,而不是您自己執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.