为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

C C++ C#
linux快速入门培训 2018-02-09 18:58:17
查看完整描述

5 回答

?
android也疯狂

To sum up,新式的"变长数组",相对于malloc所分配出的"动态数组",它不能解决一些问题,包括但不限于:

1. 爆栈。malloc分配是在堆区,堆区向来慷慨大方能给多少给多少,可是"变长数组"仍然是在栈上分配的,开大了还是会爆栈。

2. 虽说"变长数组"可以运行期指定大小,但是大小一旦指定就不可变。你还是没办法用它实现vector(或者类似的结构)。

3. 自己管内存。因为"变长数组"仍然是栈上分配的,栈下生,栈下死。

如果反过来的话,"动态数组"只能一定程度上代替"变长数组"。

原因之一是另一位答主提到过的,某些情况下根本就没有"堆",也没有动态内存分配。
另一方面堆分配比较耗时,频繁申请释放还可能会产生内存碎片。

查看完整回答
2 反对 回复 2018-02-11
?
慕UI4062818

VLA的目的就是数组的长度是由一个变量指定的,而非常数。而动态数组,则是数组长度可以随需求变化(扩充)。

VLA目前在MSVC/GCC上的实现全部都是利用到了alloca() ,在栈上动态申请一块内存(移动栈指针),当函数返回时,栈指针回归外一层函数时的状态,因而alloca() 分配的内存得以释放。

实际工程中不推荐使用VLA。原因如下:

若数组长度很大,有造成爆栈的危险。OS给进程的栈的大小是有限的。

使用alloca()后会造成部分与栈操作有关的编译器优化失效。

因此,若数组长度有可能很大,请直接在堆上分配避免爆栈。

若数组长度有个确定的上限值,可直接用那个上限值来申请栈空间

查看完整回答
1 反对 回复 2018-02-11
?
千岁不倒翁

一个是声明的时候可以用变量声明数组长度,运行到这句的时候会开辟'变量'长度的内存,而这段内存你是没法让他扩大的,也就是数组长度还是固定的

一个相当于是你在堆上声明'变量'长度的内存,并把这段内存当作你要的数组空间。这样你就可以随意用realloc在堆上扩大/缩小你开辟的内存空间,which可以在运行时随意让数组变长变短变粗

查看完整回答
1 反对 回复 2018-02-11
?
所谓伊人_在水一方

变长数组一般是在栈上分配,动态数组一般是在堆上分配。

变长数组在函数返回之后声明周期就结束了,而动态数组需要手动free掉。

变长数组使用多了容易栈溢出,而且它在c11里只是可选特性,和标准 C++ 也不兼容,所以不建议过多使用。

查看完整回答
反对 回复 2018-02-11
?
喵喵一只汪

//img.mukewang.com/5a7f99fa0001e3f006550103.jpg

使用 malloc( ) 等函数分配而成的「动态数组」的生命周期可自由控制,也可以中途以 realloc ( ) 改变大小

查看完整回答
反对 回复 2018-02-11

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信