【问题标题】:VLA works on gcc-4.9.2 but not on gcc-6.2.0VLA 适用于 gcc-4.9.2 但不适用于 gcc-6.2.0
【发布时间】: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 之前未初始化。

标签: c variable-length-array


【解决方案1】:
int len, i;
int test[len];

您正在执行test[len],但此时len 尚未初始化。从未初始化的变量中读取具有未定义的行为。

要解决此问题,请在使用之前初始化 len:

if (scanf("%d",&len) != 1) {
    // handle error
}
int test[len];

在您的其余代码中,使用i&lt;len 而不是i&lt;=len,否则您将访问仅存在len 的len+1 元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多