用变量声明一个数组[重复]

Posted

技术标签:

【中文标题】用变量声明一个数组[重复]【英文标题】:Declare an array with a variable [duplicate] 【发布时间】:2013-10-02 07:13:12 【问题描述】:

我相信声明数组时数组的大小应该是一个常量 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];

输入:5 输出:没有。但没有错误。

【问题讨论】:

VLA. C 标准在这方面已经发展,一些编译器在标准定义之前接受了 VLA (Variable Length Arrays) 作为扩展。另见Flexible Array Members 谢谢。那么所需的空间是在运行时在栈上分配的? 因此经常会看到 c 结构的最后一个成员的形式为 int ar[] 或 int ar[0],它们的内存是在后面分配的。 @user1798211 C 没有指定内存组织。许多架构会将 VLA 放在“堆栈”上。它也可以放在其他一些内存池中。 C VLA 构造确保array[i] 的分配、解除分配、范围和生命周期,而不是它的位置。 【参考方案1】:

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

VLA 通过将数组放入堆栈来工作。这使得分配和访问非常快,但堆栈通常很小(几 KB),当 VLA 溢出堆栈时,它与无限递归无法区分。

【讨论】:

但是长度限制在SIZE_MAX字节:) 实际上 VLA 长度被限制在一个低得多的范围内。典型的调用堆栈帧应该是几千字节。在当前系统上,单个调用堆栈帧的 1 MB 是巨大的。 @Acme 我没有发现 VLA 驻留在“堆栈”中的 C 规范。正如您所建议的,VLA 可能存在于“堆栈”上,它可能与 malloc/free 存在于同一个内存池中。它的速度和位置取决于平台(可能还有运行时)。【参考方案2】:

程序为什么要返回错误?你期待什么?检查 C 中的 VLA。

Reference_to_VLA

【讨论】:

以上是关于用变量声明一个数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

js从一个函数重新分配一个值给多个已经声明的变量[重复]

#1已经声明的变量myarr,被重复申明

语法 - 变量声明周围的方括号是啥意思[重复]

“变量不能用作常量”c ++数组[重复]

关于变量声明的var,let,const

es6学习