You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:45:03