动态创建的二维数组如何初始化?下述C++代码报错问题如何解决?
C++动态二维数组初始化错误问题分析与解决
代码存在的核心问题
- 类型不匹配:你通过
new bool[ROWS * COLUMNS]分配的是连续存储的一维bool数组,变量p是指向单个bool的指针,不支持嵌套二维初始化列表的赋值语法。 - 语法规则不支持:C++标准不允许对
new返回的动态原生数组直接使用大括号聚合赋值,new表达式返回的是右值,不能作为赋值操作的左操作数,就是你看到的lvalue required as left operand of assignment报错的来源。 - 编译标准不匹配:大括号初始化列表是C11才引入的正式特性,你的编译器默认使用的是更早的C标准,就会触发对应的扩展初始化列表警告。
解决方法
方案1:适配一维动态数组的初始化写法
如果要保留连续内存的一维动态数组实现,把嵌套的二维初始化列表展开为一维即可,编译时添加-std=c++11或更高版本的标准参数即可正常编译:
#define ROWS 5 #define COLUMNS 5 int main(void) { bool *p = new bool[ROWS * COLUMNS] { false, true, false, true, true, true, false, true, false, true, false, true, false, false, false, true, false, false, false, true, true, true, false, true, false }; // 访问第i行第j列的写法:p[i * COLUMNS + j] // 使用完成后记得释放内存 delete[] p; return 0; }
如果需要兼容C++11之前的标准,先申请动态数组后逐元素赋值即可。
方案2:实现真正的二维动态数组
如果你要保留二维初始化列表的写法,可以分配指针数组形式的二维动态数组:
#define ROWS 5 #define COLUMNS 5 int main(void) { bool **p = new bool*[ROWS] { new bool[COLUMNS] {false, true, false, true, true}, new bool[COLUMNS] {true, false, true, false, true}, new bool[COLUMNS] {false, true, false, false, false}, new bool[COLUMNS] {true, false, false, false, true}, new bool[COLUMNS] {true, true, false, true, false} }; // 访问第i行第j列的写法:p[i][j] // 释放时需要先逐行释放,再释放指针数组 for(int i = 0; i < ROWS; i++) { delete[] p[i]; } delete[] p; return 0; }
方案3:更推荐的现代C++写法
使用标准库容器std::vector,无需手动管理内存,也支持原生的二维初始化列表语法,代码更安全:
#include <vector> #define ROWS 5 #define COLUMNS 5 int main(void) { std::vector<std::vector<bool>> p = { {false, true, false, true, true}, {true, false, true, false, true}, {false, true, false, false, false}, {true, false, false, false, true}, {true, true, false, true, false} }; // 直接使用p[i][j]访问元素,无需手动释放内存 return 0; }
内容的提问来源于stack exchange,提问作者Abdullah Aftab
相关产品推荐
相关产品推荐

