【发布时间】:2013-10-13 01:57:41
【问题描述】:
这是我的一位朋友编写的 C 程序。
据我所知,数组必须在 C99 引入 VLA 之前的编译时初始化,或者在运行时使用 malloc。
但这里程序从用户那里接受const 的值并相应地初始化数组。
即使使用gcc -std=c89,它也可以正常工作,但对我来说看起来很不对劲。
这一切都依赖于编译器吗?
#include <stdio.h>
int
main()
{
int const n;
scanf("%d", &n);
printf("n is %d\n", n);
int arr[n];
int i;
for(i = 0; i < n; i++)
arr[i] = i;
for(i = 0; i < n; i++)
printf("%d, ", arr[i]);
return 0;
}
【问题讨论】:
-
如果我按照你的建议编译它,我会看到警告
test.c:7: warning: writing into constant object (argument 2),表明编译器知道这不好。 -
当然,这意味着这里真正的问题是您正在尝试修改
const对象。所以与 VLA 无关;) -
它是 C99 之前的 GNU 扩展,使用
-pedantic编译。 -
是的,我收到了警告,但我原以为编译器不会为我编译代码并且程序无法运行。为什么有些规则执行得很彻底,有些错误却被警告放过?
标签: c arrays dynamic-memory-allocation