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