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