c语言变长数组和动态数组有什么区别,能否完全取代?

linux快速入门培训
浏览 8180回答 4
4回答

android也疯狂

To sum up,新式的"变长数组",相对于malloc所分配出的"动态数组",它不能解决一些问题,包括但不限于:1. 爆栈。malloc分配是在堆区,堆区向来慷慨大方能给多少给多少,可是"变长数组"仍然是在栈上分配的,开大了还是会爆栈。2. 虽说"变长数组"可以运行期指定大小,但是大小一旦指定就不可变。你还是没办法用它实现vector(或者类似的结构)。3. 自己管内存。因为"变长数组"仍然是栈上分配的,栈下生,栈下死。如果反过来的话,"动态数组"只能一定程度上代替"变长数组"。原因之一是另一位答主提到过的,某些情况下根本就没有"堆",也没有动态内存分配。另一方面堆分配比较耗时,频繁申请释放还可能会产生内存碎片。

慕UI4062818

VLA的目的就是数组的长度是由一个变量指定的,而非常数。而动态数组,则是数组长度可以随需求变化(扩充)。VLA目前在MSVC/GCC上的实现全部都是利用到了alloca() ,在栈上动态申请一块内存(移动栈指针),当函数返回时,栈指针回归外一层函数时的状态,因而alloca() 分配的内存得以释放。实际工程中不推荐使用VLA。原因如下:若数组长度很大,有造成爆栈的危险。OS给进程的栈的大小是有限的。使用alloca()后会造成部分与栈操作有关的编译器优化失效。因此,若数组长度有可能很大,请直接在堆上分配避免爆栈。若数组长度有个确定的上限值,可直接用那个上限值来申请栈空间

所谓伊人_在水一方

变长数组一般是在栈上分配,动态数组一般是在堆上分配。变长数组在函数返回之后声明周期就结束了,而动态数组需要手动free掉。变长数组使用多了容易栈溢出,而且它在c11里只是可选特性,和标准 C++ 也不兼容,所以不建议过多使用。

喵喵一只汪

使用 malloc( ) 等函数分配而成的「动态数组」的生命周期可自由控制,也可以中途以 realloc ( ) 改变大小
打开App,查看更多内容
随时随地看视频慕课网APP