C语言变长数组是否只能拥有自动存储期限?


rt,是不是变长数组只能拥有自动存储期限,而拥有静态存储期限的就不会被视为变长数组?
e.g.:


 #include <stdio.h>

int n = 10;
int a[n] = {...};

int main(void)
{
    for (int i = 0; i < n; i++)
        printf("%d", a[i]);

    return 0;
}

是非法的


 #include <stdio.h>

int main(void)
{
    int n = 10;
    int a[n] = {...};

    for (int i = 0; i < n; i++)
        printf("%d", a[i]);

    return 0;
}

是合法的?

c 求助 数组

泡沫的幻想 9 years, 7 months ago

问题已经解决,感谢大家的回答!
脑子一抽写错了点————变长数组没法写初始化式。。。
另外,变长数组不能具有静态存储期限,因为它的长度是编译时决定的,而变长数组的长度要到运行时才能确定,所以只能是作为拥有自动存储期限的变量。

另外变长数组是C99新特性,不过vc比较拽一直懒得实现。

此方♂彼方 answered 9 years, 7 months ago

理论上这两种都是非法的。
但是后一种,如果去掉 = {...} 的话编译器(部分编译器)是可以编译出正确的代码的。
原因是,第一中写法的数组是全局变量,他的空间是在程序运行初始化的时候分配的,这个时候 n 并不一定被初始化为一个确定的值。
后一种局部的数组是在程序运行到这一句的时候分配的,这个时候 n 是确定的值,所以程序知道分配多少空间。

我是老司机 answered 9 years, 7 months ago

Your Answer