c这里咋错了啊?

来源:百度知道 编辑:UC知道 时间:2024/05/14 10:53:54
void main()
{
int n=5;
int a[n];
……
}
上面的"int a[n];"这里的n不是常数吗?不是等于5吗?为什么说错了呢?

C语言明文规定在非函数参数列表情形下声明数组时,方括号里面声明数组大小的必须是一个正整型常数或者通过#define预定义的符号化正整型常量,不能是变量。
比如说:
int a[5];
或者
#define N 5
int a[N];
是合法的数组声明。

这样做是为了不增加编译器的编译工作负担。因为编译器在开始编译的时候就已经得知了数组的准确大小。不必跟踪一个变量,直到运行时才得知你要声明的数组的大小。

C99为了让C能更好支持数值计算,确实给数组增加了新的特性,叫变长数组(VLA,variable length array)。你的写法在支持C99的编译环境下是没错的。不过,楼上所谓的C99打破了这一限制的说法也是不够清晰明朗的。

C99虽然支持变长数组,但是你要注意,只有本地数组(local array)才可变长,但是一个变长数组在它的生命周期内长度并不改变。所以,假设你有这么一个函数
foo()
{
int n = 5;
int a[n];

...
n = 9;
...
}
在整个块(就是花括号里面)中,数组a的长度是不可以再变的。所以你不要以为后面可以通过改变n的值让编译器重新为你分配一个9元素的数组。变长数组不是动态数组。不能动态地时刻准备着让长就长叫短就短。

楼主请记住,计算机包括计算机程序(编译器其实也是一个程序)处理的是一种模式,模式是什么,模式就是定死的框框规则,在这个框框内它可以有一定的灵活性,但是它不能越出这个框框,这就像中国象棋里面的将帅一样,因为你不能让一个死的东西出应对千变万化的情况,那样它的工作只能是乱套。

楼主,个人建议你先不要急着过渡到C99,先把C89(ANSI C)或者C90(ISO C)精通之后再去关注C99增加的一些特性。

n当然不是常数,n的变量啊,常数是不能被赋值的
这样就可以了
#define n 5
void main()
{

in