VLA适用于gcc-4.9.2但不适用于gcc-6.2.0

时间:2017-01-28 14:26:12

标签: c variable-length-array

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}}

关于可能出错的问题?

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}}元素。