我编写了一个程序,其中数组的大小被视为用户的输入。
#include <stdio.h>
main()
{
int x;
scanf("%d", &x);
int y[x];
/* some stuff */
}
这个程序无法在我学校的编译器Turbo C(古董编译器)上编译。 但是当我在使用GNU CC的PC上尝试此操作时,它已成功编译。
所以我的问题是,这是一个有效的C程序吗?我可以使用用户的输入来设置数组的大小吗?
答案 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并以可移植的方式自由创建数组。