簡體   English   中英

使用sizeof的恆定大小數組初始化

[英]Constant size array initalization with sizeof

為什么以下工作在gcc c99上能正常工作

int a[] = {1,2,3};
int b[sizeof a / sizeof *a] = {0};

但這會導致編譯錯誤

int n = sizeof a / sizeof *a;
int b[n] = {0};

錯誤

file.c:14:2: error: variable-sized object may not be initialized
file.c:14:2: warning: excess elements in array initializer [enabled by default]
file.c:14:2: warning: (near initialization for 'b') [enabled by default]

n是一個不同於sizeof a / sizeof *a的變量,因為后者是在編譯時計算的。

int b[n]聲明一個可變長度的數組。 您無法使用初始化列表初始化它。 您可以使用循環或memeset函數將其所有元素初始化為0

memset(b, 0, sizeof(b));

第一個示例起作用是因為sizeof a / sizeof *a是一個常量表達式,可以用作數組維。

在第二個示例中, n不是常量表達式,因此編譯器將b視為可變長度數組的定義,錯誤是說VLA可能未初始化。

暫無
暫無

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

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