C++变长子数组二维数组访问输出垃圾值问题排查
问题分析与修复:可变长度二维数组访问异常
核心错误点
- 指针起始地址丢失:循环中执行
p++会修改指针p的指向,循环结束后p已不再指向最初分配的指针数组起始位置。此时用p[r][c]访问元素,相当于从错误的地址偏移,必然读取到垃圾值甚至触发内存访问错误。 - 语法错误:
int *sub_arr = new int[sub_size]行末尾缺少分号,会导致编译失败。 - 错误的内存释放:
p的指向被修改后,执行delete []p会释放错误的内存区域,引发未定义行为。
修正后的代码
#include <iostream> using namespace std; int main() { int size, queries; cin >> size >> queries; int **p = new int *[size]; int sub_size; for (int i = 0; i < size; i++) { cin >> sub_size; int *sub_arr = new int[sub_size]; // 补上缺失的分号 for (int j = 0; j < sub_size; j++) { cin >> sub_arr[j]; } p[i] = sub_arr; // 通过索引赋值,保留p的起始地址 } int r, c; for (int i = 0; i < queries; i++) { cin >> r >> c; cout << p[r][c] << endl; } // 先释放每个子数组内存,再释放指针数组 for (int i = 0; i < size; i++) { delete [] p[i]; } delete [] p; return 0; }
关键修复说明
- 恢复
p[i] = sub_arr的赋值方式:通过索引操作指针数组,确保p始终指向数组起始位置,后续查询时的地址偏移逻辑正确。 - 补充分号修复语法错误,保证代码正常编译。
- 调整内存释放顺序:先逐个释放子数组的堆内存,再释放存储指针的数组,避免内存泄漏和堆内存损坏。
内容的提问来源于stack exchange,提问作者Zohaib Hamdule
相关产品推荐
相关产品推荐

