38

给数组分配内存有两种方式,一开始是不知道大小的。最常见的方法是这样malloc使用

int * array;
... // when we know the size
array = malloc(size*sizeof(int));

但是在 C99 中,在我们知道大小之后定义数组也是有效的。

... // when we know the size
int array[size];

它们完全一样吗?

4

1 回答 1

49

不,它们并不完全相同。虽然两者都允许您存储相同数量和类型的对象,但请记住:

  • 您可以free()使用 malloced 数组,但不能free()使用可变长度数组(尽管它超出范围并在离开封闭块后不再存在)。在技​​术术语中,它们具有不同的存储持续时间分配给 malloc 和自动用于可变长度数组。
  • 尽管 C 没有堆栈的概念,但许多实现从堆栈分配可变长度数组,而malloc分配。这是堆栈受限系统的一个问题,例如许多嵌入式操作系统,其中堆栈大小约为 kB,而堆则大得多。
  • malloc使用可变长度数组测试失败的分配也更容易。
  • malloced 内存的大小可以用 改变realloc(),而 VLA 不能(更准确地说,只能通过使用不同的数组维度再次执行块——这会丢失以前的内容)。
  • 托管的 C89 实现仅支持malloc().
  • 托管的 C11 实现可能不支持可变长度数组(然后必须__STDC_NO_VLA__根据 C11 6.10.8.3 将其定义为整数 1)。
  • 我错过的其他一切:-)
于 2013-05-21T14:22:17.977 回答