【发布时间】:2017-01-28 14:26:11
【问题描述】:
在gcc 上测试 VLA 的非常简单的代码在 gcc-4.2.9 (Raspbian) 上运行良好,但在 gcc-6.2.0 (Ubuntu) 上运行良好。我很惊讶。虽然编译没有错误,但输出不正确。
代码:
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;
参数:
8
输出:
使用 4.2.9 (Raspbian),
0 1 4 9 16 25 36 49 64
使用 6.2.0 (Ubuntu),
0 1 4 9 16 1
它甚至没有达到 8 的数量。我很惊讶。如果我硬编码len 的值,同样的代码也可以工作。
0 1 4 9 16 25 36 49 64
知道可能出了什么问题吗?
【问题讨论】:
-
这不是一个真正的 Unix 和 Linux 问题。这种错误的 C 编程可以在任何操作系统上完成。 (-:
-
这是一个面试问题 - 告诉我们这个程序有什么问题?声明为
int test[len]的数组具有有效索引 0 ... len-1,因此您超出了数组的末尾。 -
len在定义 VLA 之前未初始化。