1

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

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

这个程序在我学校的编译器Turbo C(一个古董编译器)上编译失败。但是当我在我的带有 GNU CC 的 PC 上尝试这个时,它编译成功了。

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

4

4 回答 4

3

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

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

于 2013-05-15T02:36:41.827 回答
3

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

于 2013-05-15T02:39:22.690 回答
2

与其问这是否是严格有效的 C 代码,不如问它是否是好的 C 代码。尽管它是有效的,但正如您所见,许多编译器不支持可变长度数组。

许多现代编译器不支持可变长度数组。其中包括 Microsoft Visual Studio 和一些版本的 IBM XL 编译器。如您所见,可变长度数组并非完全可移植。如果代码只在支持该功能的系统上使用,但如果它必须在其他系统上运行,那很好。相反,最好使用合理的限制分配具有恒定大小的数组,或者使用 malloc 和 free 以可移植的方式创建数组。

于 2013-05-15T04:01:54.417 回答
2

c90不支持可变长度数组,您可以使用以下命令行查看:

gcc -std=c90 -pedantic code.c

您将看到如下错误消息:

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

但这c99是完全有效的:

gcc -std=c99 -pedantic code.c
于 2013-05-15T02:40:31.607 回答