这是一个有效的C程序吗?

时间:2013-05-15 02:32:57

标签: c gcc cc turbo-c

我编写了一个程序,其中数组的大小被视为用户的输入。

#include <stdio.h>
main()
{
    int x;
    scanf("%d", &x);
    int y[x];
    /* some stuff */
}

这个程序无法在我学校的编译器Turbo C(古董编译器)上编译。 但是当我在使用GNU CC的PC上尝试此操作时,它已成功编译。

所以我的问题是,这是一个有效的C程序吗?我可以使用用户的输入来设置数组的大小吗?

4 个答案:

答案 0 :(得分:3)

它现在是一个有效的C程序,但它不是15年前。

无论哪种方式,它都是一个有缺陷的C程序,因为使用x时并不知道它有多大。用户可以输入x的恶意值并导致程序崩溃或更糟。

答案 1 :(得分:3)

C99使C程序员能够使用可变长度数组,这些数组的大小在运行时才知道。 - C:参考手册

答案 2 :(得分:2)

c90不支持使用此命令行可以看到的可变长度数组:

gcc -std=c90 -pedantic code.c

您将看到如下错误消息:

warning: ISO C90 forbids variable length array ‘y’ [-Wvla]

c99这完全有效:

gcc -std=c99 -pedantic code.c

答案 3 :(得分:2)

不要问这是否是严格有效的C代码,而是询问它是否是好的C代码可能更好。虽然它是有效的,但正如您所见,许多编译器不支持可变长度数组。

许多现代编译器不支持可变长度数组。其中包括Microsoft Visual Studio和某些版本的IBM XL编译器。如您所见,可变长度数组不是完全可移植的。如果代码仅用于支持该功能的系统,而不是必须在其他系统上运行,那就没问题。相反,使用合理的限制分配具有常量大小的数组可能更好,或者使用malloc并以可移植的方式自由创建数组。