C 用变量声明数组

C 用变量声明数组,c,C,我认为当声明数组时,它的大小应该是一个常量int。 然而,我编译了下面的代码,它没有得到任何错误。 你能解释一下吗 #include <stdio.h> void function(int); int main(void){ int m = 0; scanf("%d", &m); function(m); return 0; } void function(int i){ int array[i]; } #包括 空洞函数(int); 内部主(空){

我认为当声明数组时,它的大小应该是一个常量int。 然而,我编译了下面的代码,它没有得到任何错误。 你能解释一下吗

#include <stdio.h>

void function(int);

int main(void){
  int m = 0;
  scanf("%d", &m);
  function(m);
  return 0;
}

void function(int i){
  int array[i];
}
#包括
空洞函数(int);
内部主(空){
int m=0;
scanf(“%d”、&m);
功能(m);
返回0;
}
虚函数(int i){
int数组[i];
}
投入:5
输出:没有。但是没有出错。

从C99中添加的可变长度数组(或VLA)是一种自动存储持续时间的数组数据结构,其长度在运行时(而不是编译时)确定


VLA的工作原理是将数组放置在堆栈中。这使得分配和访问速度非常快,但堆栈通常很小(只有几KB),当VLA溢出堆栈时,它与无限递归无法区分。

为什么程序会返回错误?你在期待什么?检查C区的VLA


。C标准在这方面有所发展,在定义标准之前,一些编译器接受VLA()作为扩展。另见,谢谢。因此,所需的空间是在堆栈的运行时分配的?因此,看到c结构的最后一个成员是int-ar[]或int-ar[0]的形式并不少见,其中这些成员的内存是在后者分配的。@user1798211 c没有指定内存组织。许多体系结构将VLA放在“堆栈”上。它也可以放在其他内存池中。C VLA结构确保
数组[i]
的分配、解除分配、范围和生存期,而不是其位置。但是,长度限制为
大小\u MAX
字节:),实际上VLA长度限制在一个更低的范围内。典型的调用堆栈帧应该是几千字节。在当前系统中,单个调用堆栈帧的1兆字节是巨大的。@Acme我没有发现VLA驻留在“堆栈”中的C规范。正如您所建议的,VLA可能存在于“堆栈”上,它可能存在于与malloc/free相同的内存池中。它的速度和位置取决于平台(可能还有运行时)。