给数组分配内存有两种方式,一开始是不知道大小的。最常见的方法是这样malloc
使用
int * array;
... // when we know the size
array = malloc(size*sizeof(int));
但是在 C99 中,在我们知道大小之后定义数组也是有效的。
... // when we know the size
int array[size];
它们完全一样吗?
给数组分配内存有两种方式,一开始是不知道大小的。最常见的方法是这样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 和自动用于可变长度数组。malloc
从堆分配。这是堆栈受限系统的一个问题,例如许多嵌入式操作系统,其中堆栈大小约为 kB,而堆则大得多。malloc
使用可变长度数组测试失败的分配也更容易。realloc()
,而 VLA 不能(更准确地说,只能通过使用不同的数组维度再次执行块——这会丢失以前的内容)。malloc()
.__STDC_NO_VLA__
根据 C11 6.10.8.3 将其定义为整数 1)。