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

标签 c variable-length-array

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

知道可能出了什么问题吗?

最佳答案

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元素仅 len存在。

关于c - VLA 适用于 gcc-4.9.2,但不适用于 gcc-6.2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41912023/

相关文章:

c - 所有 `if/else-if/else-if` 语句的段错误,但在评论其中一个语句时没有

c++ - 为什么C++中没有定义n的sizeof(array A[n])是固定的?

C99 - 为什么我不能在 Xcode 6 中使用变长字符数组?

c - 为什么我在 Xcode 中处理字符串时没有遇到错误?

c - 在 OpenGL 中沿对象后面的方向旋转相机

c - 从串行端口读取时如何实现 read() 超时(C/C++)

c++ - 在 gcc 中将二维数组初始化为 0 时的值不正确

c++ - 用另一个数组初始化指向数组的指针的点

c - 为什么带变量的数组分配有效?

c - isalnum 等效于使用#define