分配数组 VS。可变长度数组[重复]
Posted
技术标签:
【中文标题】分配数组 VS。可变长度数组[重复]【英文标题】:malloced array VS. variable-length-array [duplicate] 【发布时间】:2013-05-16 08:34:10 【问题描述】:有两种方法可以为数组分配内存,其中的大小一开始是未知的。最常见的方式是像这样使用malloc
int * array;
... // when we know the size
array = malloc(size*sizeof(int));
但在 C99 中,在我们知道大小后定义数组也是有效的。
... // when we know the size
int array[size];
它们绝对是一样的吗?
【问题讨论】:
第二个,即使在 C99 中,也不总是有效的。根据 C99 §6.10.8.3 Conditional Feature Macros,实现可以定义 _STDC_NO_VLA_ 和 not 实现可变长度数组,并且仍符合标准。 这不是重复的问题!所引用的问题都没有关于差异的详细信息。 @WhozCraig AFAIK,这是 2011 年的事情。在我所拥有的内容中没有这样的部分声称是 C99 标准的副本。 @WhozCraig 这是 2011 版标准的工作草案。 VLA 是可选的,它们不在 1999 版中。该部分还没有在 C99 中,它是在标准之间的 12 年中添加的。 (以防万一here 是批准前的最后一个草案。) @DanielFischer 感谢您的链接和澄清,先生。我从来没有一天不学习新东西。 【参考方案1】:不,它们并不完全相同。虽然两者都允许您存储相同数量和类型的对象,但请记住:
您可以free()
分配数组,但不能free()
可变长度数组(尽管它超出范围并且一旦离开封闭块就不再存在)。用技术术语来说,它们有不同的存储持续时间:分配用于malloc,而自动用于可变长度数组。
虽然 C 没有 堆栈 的概念,但许多实现从堆栈分配可变长度数组,而 malloc
从 堆 分配。这是堆栈受限系统上的一个问题,例如许多嵌入式操作系统,其中堆栈大小约为 kB,而堆则大得多。
使用malloc
测试分配失败也比使用可变长度数组更容易。
可以使用realloc()
更改分配的内存大小,而 VLA 则不能(更准确地说,只能使用不同的数组维度再次执行块 - 这会丢失以前的内容)。
托管的 C89 实现仅支持 malloc()
。
托管的 C11 实现可能不支持可变长度数组(然后必须根据 C11 6.10.8.3 将 __STDC_NO_VLA__
定义为整数 1)。
我错过的所有其他内容 :-)
【讨论】:
一个 VLA 在封闭块的末尾超出范围(不再可见),因为它具有块范围。它在块的末尾不再存在,因为它具有自动存储持续时间。两种不同的东西。 @KeithThompson:确切地说,数组的标识符在封闭块的末尾超出了范围。范围是标识符(名称)的属性,而不是对象的属性。一个对象可以在它的标识符范围之外被访问,就像它的地址被传递给另一个例程一样。 @EricPostpischil:你已经超越了我! @Jens C 没有堆栈的概念 到底是什么意思?我第一次听到这个并且很感兴趣。能详细点吗? @Daniel main() 是入口,但它可能不是出口。终止程序的其他函数有 exit()、quick_exit()、_Exit() 和 abort()。以上是关于分配数组 VS。可变长度数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章