为什么GCC允许可变大小数组的静态内存分配?

时间:2016-09-18 17:08:20

标签: c gcc dynamic-memory-allocation

我编写了一个简单的代码,它从用户那里获取一个整数作为输入,并分配一个该变量大小的数组。

#include <stdio.h>

int main(){
    int n, i;
    scanf("%d", &n);

    int arr[n];
    for(i=0; i<n; i++){
        arr[i] = i;
    }
    for(i=0; i<n; i++){
        printf("%d\t", arr[i]);
    }

    return 0;
}

上面的代码工作正常(如果数组大小不是很大,则给出大小为2,150,000的seg错误)。这甚至是怎么允许的?我认为应该使用动态内存分配来完成,因为数组大小是可变的。

我的整个内存分配概念已经动摇了。请解释在什么条件允许的情况下(应该是合法代码)。

1 个答案:

答案 0 :(得分:0)

从标准的ISO C99版本开始,允许使用可变长度自动数组

引自2011 C标准,6.7.5.2数组声明符:

  

如果大小不存在,则数组类型为不完整类型。如果   大小是*而不是表达式,数组类型是a   可变长度数组类型的未指定大小,只能使用   在具有函数原型范围的声明中。

     

如果大小是不是整数常量的表达式   表达式:如果它出现在函数原型范围的声明中,   它被视为被*替换;否则,每次都是   评估它应具有大于零的值。每个的大小   可变长度数组类型的实例在其期间不会更改   寿命。