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