为什么GCC允许对可变大小的数组进行静态内存分配?
我编写了一个简单的代码,它接受一个整数作为用户的输入,并分配一个大小可变的数组为什么GCC允许对可变大小的数组进行静态内存分配?,c,gcc,dynamic-memory-allocation,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]);
#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;
}
#包括
int main(){
int n,i;
scanf(“%d”和“&n”);
int-arr[n];
对于(i=0;i可变长度的自动阵列,允许从标准的ISO C99版本开始
这是引用2011 C标准6.7.5.2数组声明器:
如果大小不存在,则表示数组类型不完整。如果
大小为*而不是表达式,数组类型为
未指定大小的可变长度数组类型,只能使用
在具有函数原型作用域的声明中
如果大小是非整数常量的表达式
表达式:如果它出现在函数原型范围的声明中,
它被视为被*替换;否则,每次都被替换
经评估,其值应大于零。每个
可变长度数组类型的实例在其运行期间不会更改
一生
允许从ISO C99版本的标准开始使用可变长度自动阵列
这是引用2011 C标准6.7.5.2数组声明器:
如果大小不存在,则表示数组类型不完整。如果
大小为*而不是表达式,数组类型为
未指定大小的可变长度数组类型,只能使用
在具有函数原型作用域的声明中
如果大小是非整数常量的表达式
表达式:如果它出现在函数原型范围的声明中,
它被视为被*替换;否则,每次都被替换
经评估,其值应大于零。每个
可变长度数组类型的实例在其运行期间不会更改
一生
C已经有了变长数组的概念将近18年了。存储仍然是自动的,但是运行时大小。所有关于自动存储的常规限制都适用。编译时也没有警告。编译为“gcc-Wall test.C-o test”你的问题没有意义。你的代码的哪一方面是“静态的”?何时使用malloc?如果我能够像“int arr[n]”一样声明?按照我所学的方法,当您不知道编译时结构的大小时,应该使用动态内存分配。我缺少什么?如果您需要C99之前的兼容性,或者如果您需要从当前范围之外访问内存,请使用malloc
(例如,返回指向数组的指针)。C已经有了变长数组的概念将近18年了。存储仍然是自动的,但是运行时大小。所有关于自动存储的常规限制都适用。编译时也没有警告。编译为“gcc-Wall test.C-o test”你的问题毫无意义。你的代码的哪个方面是“静态的”?那么什么时候使用malloc?如果我能够像“int arr[n]一样声明?按照我所学的方法,当您在编译时不知道结构的大小时,应该使用动态内存分配。我缺少什么?如果您需要C99之前的兼容性,或者如果您需要从当前范围之外访问内存(例如,返回指向数组的指针),请使用malloc
。