在 int len, i;
int test[len];
scanf("%d",&len);
for(i=0;i<=len;i++){
test[i]=i*i;
printf("%d\t",test[i]);}
printf("\n");
return 0;
上测试VLA的一个非常简单的代码在gcc-4.2.9(Raspbian)上运行正常,但在gcc-6.2.0(Ubuntu)上运行不正常。我很惊讶。虽然它编译没有错误,但输出不正确。
8
0 1 4 9 16 25 36 49 64
4.2.9(Raspbian),
0 1 4 9 16 1
使用6.2.0(Ubuntu),
len
它甚至达不到8.我很惊讶。如果我对0 1 4 9 16 25 36 49 64
的值进行硬编码,则相同的代码可以正常工作。
{{1}}
关于可能出错的问题?
答案 0 :(得分:2)
int len, i;
int test[len];
您正在执行test[len]
,但此时len
尚未初始化。从未初始化的变量中读取具有未定义的行为。
要解决此问题,请在使用前初始化len
:
if (scanf("%d",&len) != 1) {
// handle error
}
int test[len];
在其余代码中,请使用i<len
代替i<=len
,否则您只能访问仅存在len+1
的{{1}}元素。