我写了一个程序,其中数组的大小作为用户的输入。
#include <stdio.h>
main()
{
int x;
scanf("%d", &x);
int y[x];
/* some stuff */
}
这个程序在我学校的编译器Turbo C(一个古董编译器)上编译失败。但是当我在我的带有 GNU CC 的 PC 上尝试这个时,它编译成功了。
所以我的问题是,这是一个有效的 C 程序吗?我可以使用用户的输入设置数组的大小吗?
它现在是一个有效的 C 程序,但不是 15 年前。
无论哪种方式,它都是一个有缺陷的 C 程序,因为x
在不知道它可能有多大的情况下使用它。用户可以输入恶意值x
并导致程序崩溃或更糟。
C99 使 C 程序员能够使用可变长度数组,这些数组的大小直到运行时才知道。--C:参考手册
与其问这是否是严格有效的 C 代码,不如问它是否是好的 C 代码。尽管它是有效的,但正如您所见,许多编译器不支持可变长度数组。
许多现代编译器不支持可变长度数组。其中包括 Microsoft Visual Studio 和一些版本的 IBM XL 编译器。如您所见,可变长度数组并非完全可移植。如果代码只在支持该功能的系统上使用,但如果它必须在其他系统上运行,那很好。相反,最好使用合理的限制分配具有恒定大小的数组,或者使用 malloc 和 free 以可移植的方式创建数组。
c90
不支持可变长度数组,您可以使用以下命令行查看:
gcc -std=c90 -pedantic code.c
您将看到如下错误消息:
warning: ISO C90 forbids variable length array ‘y’ [-Wvla]
但这c99
是完全有效的:
gcc -std=c99 -pedantic code.c