簡體   English   中英

如何在sizeof運算符的幫助下初始化數組?

[英]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.

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