malloced数组VS. 变长数组
有两种方法可以为数组分配内存,其大小在开始时是未知的。 最常见的方法是使用像这样的malloc
int * array; ... // when we know the size array = malloc(size*sizeof(int));
但是在我们知道尺寸后,在C99中定义数组也是有效的。
... // when we know the size int array[size];
他们完全一样吗?
不,他们不是绝对一样。 虽然两者都允许您存储相同数量和类型的对象,但请记住:
- 你可以
free()
一个malloced数组,但你不能free()
一个可变长度的数组(虽然它超出范围并且一旦封闭的块被留下就不再存在)。 在技术术语中,它们具有不同的存储持续时间 : 分配给malloc而不是自动用于可变长度数组。 - 虽然C没有堆栈的概念,但许多实现从堆栈中分配一个可变长度数组,而
malloc
从堆中分配。 这是堆栈受限系统上的问题,例如许多嵌入式操作系统,其中堆栈大小为大约kB,而堆大得多。 - 使用
malloc
测试失败的分配比使用可变长度数组更容易。 - malloced内存的大小可以通过
realloc()
来改变,而VGA则不能(更准确地说,只能通过使用不同的数组维度再次执行该块 – 这会丢失先前的内容)。 - 托管的C89实现仅支持
malloc()
。 - 托管的C11实现可能不支持可变长度数组(然后必须根据C11 6.10.8.3将
__STDC_NO_VLA__
定义为整数1)。 - 我错过的其他一切:-)