我编写了一个简单的代码,它从用户那里获取一个整数作为输入,并分配一个该变量大小的数组。
#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错误)。这甚至是怎么允许的?我认为应该使用动态内存分配来完成,因为数组大小是可变的。
我的整个内存分配概念已经动摇了。请解释在什么条件允许的情况下(应该是合法代码)。
答案 0 :(得分:0)
从标准的ISO C99版本开始,允许使用可变长度自动数组
引自2011 C标准,6.7.5.2数组声明符:
如果大小不存在,则数组类型为不完整类型。如果 大小是*而不是表达式,数组类型是a 可变长度数组类型的未指定大小,只能使用 在具有函数原型范围的声明中。
如果大小是不是整数常量的表达式 表达式:如果它出现在函数原型范围的声明中, 它被视为被*替换;否则,每次都是 评估它应具有大于零的值。每个的大小 可变长度数组类型的实例在其期间不会更改 寿命。