关于使用非const变量初始化C++数组的技术疑问
关于C++中变量长度数组的疑问解答
1. 你写的代码是不是标准C++写法?
你这段代码里的int b[a];属于变量长度数组(VLA),这不是标准C++规定的语法。之所以能在在线编译器运行,是因为GCC、Clang这类编译器把它作为非标准扩展特性支持了,但换像MSVC这类严格遵循标准的编译器,直接就会报错。标准C++要求数组的大小必须是编译阶段就能确定的常量——比如字面量5,或者用constexpr修饰的常量变量。
2. 要是编译器支持,修改a的值会有什么影响?
数组的大小是在定义的那一刻就确定的,后续修改a的值根本不会改变b的实际大小。比如你先定义int a=5; int b[a];,之后把a改成10,b还是只有能存5个int的空间,要是敢访问b[5]或者更靠后的位置,就是内存越界,属于未定义行为,轻则程序乱输出,直接崩溃都有可能。
3. 这种写法的弊端
- 移植性极差:只有部分编译器支持,换个编译器代码直接跑不起来,完全不符合跨平台的要求。
- 内存风险高:如果
a的值太大,直接会把栈空间耗尽,导致栈溢出崩溃;要是a是负数或者0,程序行为完全不可控,大概率直接崩。 - 维护调试麻烦:这种数组没法用C++标准库的安全特性,也没法动态调整大小,出了内存问题很难排查。
4. C++里动态初始化数组的标准做法
首选:用std::vector(最安全省心)
std::vector是标准库提供的动态数组容器,自动管理内存,还能随时调整大小:
#include <vector> int a = 5; std::vector<int> b(a); // 创建包含5个int的vector,元素默认初始化为0 // 后续要改大小直接调用resize a = 10; b.resize(a); // 把vector的大小改成10,新增元素默认初始化
备选:手动动态内存分配(不推荐,需自己管内存)
用new和delete[]手动在堆上分配内存,但必须记得释放,不然会内存泄漏:
int a = 5; int* b = new int[a]; // 分配能存5个int的堆内存 // 使用数组的代码... a = 10; // 要改大小得先释放旧内存再重新分配 delete[] b; b = new int[a]; // 最后一定要记得释放内存 delete[] b;
内容的提问来源于stack exchange,提问作者junyaozheng98
相关产品推荐
相关产品推荐

