C++中可用变量定义数组长度,为什么仍需要使用动态数组?
你给出的代码:
cout<<"Enter Size of Array"; cin>>x; int arr[x];
这段语法叫做变长数组(VLA),它并不是C++标准规定的合法语法,只是部分编译器(比如GCC、Clang)为了兼容C语言特性做的扩展,存在非常多的局限性,完全替代不了动态数组。
核心原因有这几点:
- 可移植性极差
变长数组是C99标准引入的C语言特性,C从始至终没有把它加入标准。如果你把这段代码放到Visual Studio等不支持该扩展的编译器里运行,会直接报编译错误。而new创建动态数组、std::vector容器的用法是所有C编译器都支持的标准语法,不存在兼容问题。 - 栈空间上限极小
变长数组的内存是分配在程序栈区的,普通程序的栈区默认大小通常只有1~8MB。如果用户输入的x很大,比如要存100万个int类型数据,总共需要4MB以上的空间,程序会直接栈溢出崩溃。而动态数组的内存分配在堆区,堆区的可用大小通常和你的设备剩余内存相当,几GB的空间都能正常分配,完全能满足大数组的使用需求。 - 生命周期不可控
变长数组的生命周期和它所在的代码块绑定,比如你在函数内部定义了变长数组,函数执行结束时数组就会被自动销毁,你没法把这个数组返回给函数外部使用。而动态数组的生命周期由你自己控制,只要你不主动执行delete释放,它就会一直存在,可以跨函数传递、在多个逻辑模块里复用。 - 功能灵活性不足
变长数组的长度在定义时就固定死了,后续无法扩容、缩容。而动态数组可以根据实际使用需求调整长度,比如搭配std::vector使用时,可以随时调用push_back新增元素、resize调整大小,使用灵活度高很多。
实际C++开发中几乎不会有人使用变长数组这种非标准特性,标准动态数组和std::vector容器才是通用、稳定的选择。
内容的提问来源于stack exchange,提问作者Saud Khan
相关产品推荐
相关产品推荐

