用变量声明一个数组[重复]
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
【讨论】:
以上是关于用变量声明一个数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章