Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么GCC允许对可变大小的数组进行静态内存分配?_C_Gcc_Dynamic Memory Allocation - Fatal编程技术网

为什么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