C++实现链表调用traverse()出现Segmentation fault问题排查
解决链表traverse()方法的Segmentation Fault问题
你遇到的段错误问题根源出在构造函数的变量初始化错误上,咱们拆解一下问题所在:
在你的LinkedList构造函数里,你写了这样的代码:
LinkedList::LinkedList() { Node * head = NULL; Node * tail = NULL; }
这里你声明了两个局部变量head和tail,它们和类的私有成员变量head、tail是完全独立的两个东西!也就是说,类的成员变量根本没有被初始化,它们的值是随机的野指针。当你调用pushFront()时,试图给head赋值(访问野指针),或者traverse()里判断head==NULL时,都是在操作未初始化的内存,自然就触发了Segmentation Fault。
修正方法
去掉构造函数里的局部变量声明,直接给类的成员变量赋值,或者用更规范的初始化列表:
方式1:直接赋值
LinkedList::LinkedList() { head = NULL; tail = NULL; }
方式2:初始化列表(更推荐的C++类初始化方式)
LinkedList::LinkedList() : head(NULL), tail(NULL) {}
这样类的head和tail才会被正确初始化为空指针,后续pushFront()里的if(tail==NULL)能正确给尾节点赋值,traverse()也能正常遍历链表了。
修正后的完整代码
#include <iostream> using namespace std; struct Node { int data; Node * next; }; class LinkedList { private: Node * head; Node * tail; public: LinkedList(); void pushFront(int i); void traverse(); }; // 这里用初始化列表修正构造函数 LinkedList::LinkedList() : head(NULL), tail(NULL) {} void LinkedList::pushFront(int i) { Node * newNode =new Node; newNode->data=i; newNode->next=head; head=newNode; if(tail==NULL) tail = head; } void LinkedList::traverse() { if (head==NULL){ cout<<"empty list. add elements"; return; } Node * ptr = head; while(ptr!=NULL) { cout<<ptr->data; ptr=ptr->next; } } int main() { LinkedList l; l.pushFront(10); l.pushFront(9); l.traverse(); // 现在会正确输出910 return 0; }
内容的提问来源于stack exchange,提问作者whitebumblebee
相关产品推荐
相关产品推荐

