二维数组声明必须指定第二维大小,如int arr3;行数不确定时应使用std::vector<vector<int>>或动态分配int**,后者需手动管理内存。

二维数组怎么声明?别用 int arr[][] 这种写法
C++ 不允许在栈上声明未指定第二维大小的二维数组,int arr[][] 是语法错误。必须明确至少第二维(列数),因为编译器要靠它计算每行偏移。常见合法写法是 int arr[3][4](3 行 4 列)或 int arr[ROWS][COLS](常量表达式)。如果行数也不确定,就得换方案——比如用 std::vector<:vector>></:vector> 或动态分配 int**。
用 vector> 替代原生二维数组更安全
原生数组容易越界、不能自动扩容、传参麻烦;std::vector<:vector>></:vector> 虽稍慢但更实用。初始化时注意:嵌套 vector 的构造需显式指定内层大小,否则默认为空,后续访问 vec[i][j] 会崩溃。
常见写法:
std::vector<std::vector<int>> mat(3, std::vector<int>(4, 0)); // 3x4 全 0
要点:
立即学习“C++免费学习笔记(深入)”;
-
mat.size()返回行数,mat[i].size()返回第 i 行列数(可不等长) - 不能直接用
mat[i][j] = x赋值,除非该位置已存在(即mat[i]已有足够元素) - 传参推荐用
const std::vector<:vector>>&</:vector>避免拷贝
动态分配二维数组:new int*[rows] + for 循环 new int[cols]
需要运行时确定尺寸又不想用 vector 时,手动分配是可行路径,但必须配对释放,否则内存泄漏。关键点是:第一层分配指针数组,第二层为每行分配数据块。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
示例:
int** arr = new int*[rows];<br>for (int i = 0; i < rows; ++i) {<br> arr[i] = new int[cols];<br>}释放顺序不能反:
for (int i = 0; i < rows; ++i) {<br> delete[] arr[i];<br>}<br>delete[] arr;容易踩的坑:
- 忘了某次
delete[]→ 内存泄漏 - 用
delete替代delete[]→ 未定义行为 - 异常中途跳出循环 → 某些行没释放 → 泄漏
访问二维数组时下标越界为什么有时不报错?
C++ 原生数组不做边界检查,arr[5][10] 访问超出 int arr[3][4] 范围时,可能读到相邻内存、触发段错误,也可能“侥幸”返回垃圾值——这取决于内存布局和平台。调试时建议开 -fsanitize=address(ASan),它能捕获绝大多数越界访问。
vector 版本则不同:vec.at(i).at(j) 会抛 std::out_of_range 异常,而 vec[i][j] 仍不检查——这点常被忽略。
真正保险的做法是:开发阶段用 .at(),上线前确认逻辑无误再切回 [] 提性能;或者统一用 range-for 遍历,避开下标计算。

















