【发布时间】:2012-04-08 11:58:20
【问题描述】:
当我发现数组大小必须在声明时给出或在运行时使用 malloc 从堆中分配时,我正在看一本书。我用 C 编写了这个程序:
#include<stdio.h>
int main() {
int n, i;
scanf("%d", &n);
int a[n];
for (i=0; i<n; i++) {
scanf("%d", &a[i]);
}
for (i=0; i<n; i++) {
printf("%d ", a[i]);
}
return 0;
}
这段代码运行良好。
我的问题是这段代码如何才能正常工作。数组大小必须在运行时声明或在运行时使用 malloc() 分配它是否违反了 C 的基本概念。我没有做任何这些两件事,那为什么它可以正常工作?
我的问题的解决方案是 C99 支持的可变长度数组,但如果我玩弄我的代码并将语句 int a[n];以上 scanf("%d,&n); 然后它停止工作为什么会这样。如果 C 中支持可变长度数组?
【问题讨论】:
-
你的书,很可能,谈到了 C89;您的编译器可能使用 C99。它们是有些不同的语言(C99 是 C89 的演变;C11 是 C99 的演变)。区别之一是 VLA(可变长度数组)。
-
您如何确定它确实工作正常?在这样的情况下,有时它似乎适用于简单的情况,但在扩展时会变得很糟糕。即使在“成功”执行中,内部存储器也很可能已损坏-您很幸运它没有破坏程序。或者正如其他人指出的那样,您可能正在使用 C99。
-
VLA 是一个 PITA(特别是如果很大的话)。如果您可以避免它们,请这样做:)
标签: c arrays declaration