分配数组 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。可变长度数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过过度分配内存在结构中内联可变长度数组是不是有效?

使用可变长度数组是不是安全?

excel/VBA如何将数组的可变长度分配给整数变量

我如何在Javascript中拥有可变长度数组的前3个元素[重复]

使用可变长度数组是不是有任何开销?

在其内存应该已被释放后访问可变长度数组