C++操作指针实现二维链表矩阵打印时出现段错误是什么原因?
问题根因分析
col = col->right语法本身没有错误,触发段错误的核心原因是创建矩阵的逻辑存在多处指针操作错误,导致right、down指针指向了非法内存,遍历访问时触发越界:
- 未初始化的变长数组问题
void createMatrix(int m, int n)中定义的Node *mat[n]是C++标准不支持的变长数组,且未做初始化,第一次进入循环时mat数组内全是野指针,直接给node->down赋值会留下非法地址隐患。 right指针赋值逻辑完全错误if(j <= n-1) mat[j]->right = mat[j+1];这行是直接触发段错误的核心原因:
- 当j循环到最大值
n-1时,j+1会直接越界访问mat数组的非法位置 - 赋值顺序颠倒:你在创建
j位置节点时,j+1位置的节点还没生成,mat[j+1]要么是野值要么是上一行的旧值,导致当前节点的right直接指向非法地址
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
相关产品推荐
相关产品推荐

