异位数组vs变长数组



有两种方法可以为数组分配内存,其中数组的大小在开始时是未知的。最常见的方法是像这样使用malloc

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

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

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

它们绝对是相同的吗?

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

  • 你可以free()一个错位的数组,但你不能free()一个可变长度的数组(尽管它超出范围,并停止存在一旦封闭块离开)。在技术术语中,它们具有不同的存储持续时间: 为malloc分配,而自动用于可变长度数组。
  • 虽然C没有堆栈的概念,但许多实现从堆栈分配可变长度数组,而malloc分配。这在堆栈有限的系统上是一个问题,例如许多嵌入式操作系统,其中堆栈大小在kB量级,而堆要大得多。
  • 使用malloc比使用可变长度数组更容易测试分配失败。
  • malloced内存可以通过realloc()改变大小,而vla不能(更准确地说,只能通过使用不同的数组维度再次执行块,从而丢失之前的内容)。
  • 托管C89实现只支持malloc()
  • 宿主C11实现可能不支持可变长度数组(那么必须根据C11 6.10.8.3将__STDC_NO_VLA__定义为整数1)。
  • 我错过的一切:-)

相关内容

  • 没有找到相关文章

最新更新