C++中打印链表元素的分段错误
Posted
技术标签:
【中文标题】C++中打印链表元素的分段错误【英文标题】:Segmentation fault in C++ in printing linked list elements 【发布时间】:2020-04-15 11:47:06 【问题描述】:请帮忙。当我尝试打印此链接列表中的元素时,出现分段错误。 我首先声明一个类,插入和显示列表元素的函数是它的函数。 代码:
#include <iostream>
using namespace std;
struct node
int data;
node *next;
;
class ll
node *head,*tail;
public:
void push(int x)
node *temp = new node;
temp->data = x;
temp->next = NULL;
if(head == NULL)
head = temp;
tail= temp;
else
tail->next = temp;
tail= temp;
void show()
node *n = head;
while(n!=NULL)
cout<<n->data<<"\n";
n = n->next;
;
int main()
ll a;
a.push(1);
a.push(2);
a.show();
return 0;
【问题讨论】:
node* head;
不会将 head 初始化为 NULL。有时 C++ 实现会将变量归零,但这是一个不应该依赖的特性。
【参考方案1】:
数据成员head和数据成员tail都没有被nullptr初始化。所以程序有未定义的行为。
你可以写在类定义中
class ll
node *head = nullptr, *tail = nullptr;
//...
记住结构节点应该是类ll
的成员。例如
class ll
struct node
int data;
node *next;
*head = nullptr,*tail = nullptr;
public:
void push( int x )
node *temp = new node x, nullptr ;
if( head == NULL )
head = tail = temp;
else
tail = tail->next = temp;
//...
您可以在默认构造函数中初始化它们,而不是在类定义中初始化数据成员,例如
class ll
struct node
int data;
node *next;
*head,*tail;
public:
ll() : head( nullptr ), tail( nullptr )
// ...
此外,您至少需要定义析构函数并显式定义复制构造函数和复制赋值构造函数,或者将它们定义为已删除。例如
class ll
struct node
int data;
node *next;
*head,*tail;
public:
ll() : head( nullptr ), tail( nullptr )
~ll() /* must be defined */
ll( const LL & ) = delete;
ll & operator =( const ll & ) = delete;
// ...
【讨论】:
【参考方案2】:问题是您在创建列表时没有将head
设置为NULL
。同样的问题适用于tail
。这是构造函数的工作
class ll
node *head,*tail;
public:
ll() head = tail = NULL;
void push(int x)
...
【讨论】:
在 C++ 中使用NULL
是不好的做法,这也不使用初始化列表,并且作为默认值会更清晰
@LonesomeParadise OP使用了NULL
,需要先了解构造函数,初始化列表会在后面。我在这个网站上的理念是,对于完全的初学者来说,最好一次只专注于一件事。
@john 好的,但是 OP 实际上并没有在他们的代码中使用构造函数,所以这两者都引入了他们可能不熟悉的东西(ctors)和显示一种使用它们的方式,这是不好的做法和低效以上是关于C++中打印链表元素的分段错误的主要内容,如果未能解决你的问题,请参考以下文章