使用sizeof进行常量大小的数组初始化

时间:2015-02-13 13:41:39

标签: c arrays

为什么以下工作与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]

2 个答案:

答案 0 :(得分:3)

n是一个与sizeof a / sizeof *a不同的变量,因为后者是在编译时计算的。

int b[n]声明一个可变长度数组。您无法使用初始化列表初始化它。您可以使用循环或memeset函数将其所有元素初始化为0

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

答案 1 :(得分:3)

第一个例子有效,因为sizeof a / sizeof *a是一个常量表达式,可以用作数组维度。

在第二个示例中,n不是常量表达式,因此编译器将b视为可变长度数组的定义,错误是可能未初始化VLA。