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

C++操作指针实现二维链表矩阵打印时出现段错误是什么原因?

问题根因分析

col = col->right语法本身没有错误,触发段错误的核心原因是创建矩阵的逻辑存在多处指针操作错误,导致right、down指针指向了非法内存,遍历访问时触发越界:

  1. 未初始化的变长数组问题
    void createMatrix(int m, int n)中定义的Node *mat[n]是C++标准不支持的变长数组,且未做初始化,第一次进入循环时mat数组内全是野指针,直接给node->down赋值会留下非法地址隐患。
  2. right指针赋值逻辑完全错误
    if(j <= n-1) mat[j]->right = mat[j+1];这行是直接触发段错误的核心原因:
  • 当j循环到最大值n-1时,j+1会直接越界访问mat数组的非法位置
  • 赋值顺序颠倒:你在创建j位置节点时,j+1位置的节点还没生成,mat[j+1]要么是野值要么是上一行的旧值,导致当前节点的right直接指向非法地址
  1. down指针赋值逻辑错误
    if(i <= m-1)这个判断条件永远成立(i的取值范围就是0到m-1),导致第一行(i=0)的节点down指针也被赋值为未初始化的野指针,正常第一行节点的down应该为NULL。
修正后的参考代码
struct Node
{   int data;
    struct Node* right;
    struct Node* down;
};

class Matrix{
Node* mhead = NULL;
public:
Node* newNode(int d){
    Node* t = new Node;
    t->data = d;
    t->right = t->down = NULL;
    return t;
} 
void createMatrix(int m, int n){
    // 改用动态数组避免变长数组问题,初始化为NULL
    Node** mat = new Node*[n]();
    Node* prev_row_head = NULL;
    for(int i=0; i<m; i++){
        Node* curr_row_prev = NULL;
        for(int j=0; j<n; j++){
            int input;
            cin>>input;
            Node* node = newNode(input);
            // 链接当前行的右侧节点
            if(curr_row_prev != NULL){
                curr_row_prev->right = node;
            }
            curr_row_prev = node;
            // 链接上一行同列节点的down指针
            if(prev_row_head != NULL){
                Node* prev_col_node = prev_row_head;
                for(int k=0; k<j; k++){
                    prev_col_node = prev_col_node->right;
                }
                prev_col_node->down = node;
            }
            mat[j] = node;
        }
        // 记录矩阵头节点
        if(i == 0){
            mhead = mat[0];
        }
        prev_row_head = mat[0];
    }
    delete[] mat;
}
void printRowCol(){
    Node *row = mhead;
    while(row){
        Node *col = row;
        while(col){
            cout<<col->data<<' ';
            col = col->right;
        }
        cout<<"\n";
        row = row->down;
    }
}
};
通用排查参考
  • 用gdb调试时执行p col即可看到段错误时col指针的地址,如果地址为0或者非预期的野值,就可以往前追溯right指针的赋值逻辑
  • 小范围测试:先验证m=1、n=1,m=1、n=2,m=2、n=2这类小用例,手动打印每个节点的right、down指针地址,验证指向是否符合预期
  • 新增销毁节点的逻辑,避免内存泄漏

内容的提问来源于stack exchange,提问作者SacredMechanic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:54:01