为什么这个程序会出现分段错误



我目前正在努力解决我的c++入门课程的编码挑战,我只是想了解我遇到的分段错误。

我正在编写一个给定的函数,在链表的尾部插入节点。其思想是,给定整数的输入,第一个输入将被视为列表末尾的一部分,因为它的指针成员变量将是nullptr。之后,所有其他输入都必须被附加,以便它们的插入发生在该空节点之前。

这是我的第一部分功能:

SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {

if(head == nullptr) //if the list is empty
{
    head -> next = new SinglyLinkedListNode(data);
    return head;
}
return head;
} 

然而,函数的这一部分给了我一个分段错误:

head -> next = new SinglyLinkedListNode(data);

这些是类声明:

#include <bits/stdc++.h>
using namespace std;
class SinglyLinkedListNode {
 public:
    int data;
    SinglyLinkedListNode *next;
    SinglyLinkedListNode(int node_data) {
        this->data = node_data;
        this->next = nullptr;
    }
     };
class SinglyLinkedList {
public:
    SinglyLinkedListNode *head;
    SinglyLinkedList() {
        this->head = nullptr;
    }
 };

和Main:

int main()
{
ofstream fout(getenv("OUTPUT_PATH"));
SinglyLinkedList* llist = new SinglyLinkedList();
int llist_count;
cin >> llist_count;
cin.ignore(numeric_limits<streamsize>::max(), 'n');
for (int i = 0; i < llist_count; i++) {
    int llist_item;
    cin >> llist_item;
    cin.ignore(numeric_limits<streamsize>::max(), 'n');
    SinglyLinkedListNode* llist_head =
    insertNodeAtTail(llist->head, llist_item);
    llist->head = llist_head;
}
print_singly_linked_list(llist->head, "n", fout);
fout << "n";
free_singly_linked_list(llist->head);
fout.close();
return 0;
 }

我在想:

 head -> next = new SinglyLinkedListNode(data);

将创建一个新节点,并将数据参数作为其成员数据,然后当前头节点将指向该列表。

我想知道为什么会出现这种分割错误。此外,我不能更改任何类声明或构造函数,因为这就是挑战中给出它们的方式。

GDB跟踪:

Reading symbols from solution...done.
[New LWP 22279]
Core was generated by `solution'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000000400eea in insertNodeAtTail (head=<optimized out>, 
data=<optimized out>) at solution.cc:62
62          head -> next = new SinglyLinkedListNode(data);
#0  0x0000000000400eea in insertNodeAtTail (head=<optimized out>, 
data=<optimized out>) at solution.cc:62
#1  0x0000000000400c2e in main () at solution.cc:88

因为取消引用空指针(headISnull(是未定义的行为,其结果可能是分段错误:

if(head == nullptr) //if the list is empty
{
    head -> next = new SinglyLinkedListNode(data);

头为空。不能访问null对象的"next"字段。

if(head == nullptr) //if the list is empty
{
    head = new SinglyLinkedListNode(data);
    return head;
}
return insertNodeAtTail(head->next, data)

相关内容

  • 没有找到相关文章

最新更新