C++自定义mat类动态创建二维数组出现Segmentation Fault问题
问题排查结果
你的代码存在4处核心错误,全部修正后即可解决段错误问题:
- 构造函数未先给二级指针
a分配行指针数组的内存,直接解引用野指针触发非法访问。需要先执行a = new int*[r];为r个行指针申请空间。 - 构造函数循环内的内存分配逻辑错误:首先给每行申请的内存长度写死为
r,实际应该是列数c;其次使用*a++修改了二级指针a本身的指向,丢失了数组首地址,后续访问a[i][j]时完全偏移到非法内存区域,应该用下标a[i]来为对应行分配内存。 input()函数内层循环的终止条件错误,误写为i < c,实际应该是j < c,会导致j无限递增访问数组越界。display()函数存在和input()完全相同的内层循环条件错误,同样会触发越界访问。
修复后完整代码
#include<iostream> using namespace std; class mat{ int **a; int r, c; public: mat(int row, int col){ r = row; c = col; // 先分配行指针数组的内存 a = new int*[r]; for(int i = 0; i < r; i++){ // 为第i行分配col个int的空间 a[i] = new int[c]; } } // 补充析构函数释放内存,避免泄漏 ~mat() { for(int i = 0; i < r; i++) { delete[] a[i]; } delete[] a; } void input(){ for(int i = 0; i < r; i++){ // 修正循环条件为j < c for(int j = 0; j < c; j++){ cin >> a[i][j]; } } } void display(){ for(int i = 0; i < r; i++){ // 修正循环条件为j < c for(int j = 0; j < c; j++){ cout << a[i][j] << "\t"; } cout << endl; } } }; int main() { int r, c; cout << "enter row :"; cin >> r; cout << "enter column :"; cin >> c; mat m(r, c); m.input(); cout << "array \n"; m.display(); return 0; }
内容的提问来源于stack exchange,提问作者Rakesh Kr Yadav
相关产品推荐
相关产品推荐

