【问题标题】:Why is this program giving a segmentation fault?为什么这个程序会出现分段错误?
【发布时间】:2019-04-17 16:01:59
【问题描述】:

我目前正在尝试解决我的 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;
    }

 };

和主要:

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);

将使用 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

【问题讨论】:

  • 顺便说一句,启用优化的现代编译器将改为执行无效操作码陷阱。
  • edit你的问题告诉我们你做了什么样的调试。我希望您已经在 Valgrind 或类似的检查器中运行了您的minimal reproducible example,并使用诸如 GDB 之类的调试器进行了调查。确保您也启用了全套编译器警告。这些工具告诉了你什么,它们缺少什么信息?并阅读 Eric Lippert 的 How to debug small programs
  • 你真的应该避免using namespace std - 这是一个坏习惯,当你不期待它时can silently change the meaning of your program。习惯于使用命名空间前缀(std 故意很短),或者将只是您需要的名称 导入到最小的合理范围。它在头文件中尤其有害,因为您现在对包含头文件的每个源文件都造成了问题!

标签: c++ linked-list segmentation-fault


【解决方案1】:

因为取消引用空指针 (head IS null) 是 undefined behavior,其后果可能是分段错误:

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

【讨论】:

  • 当你说引用空指针时,你指的是head->next吗?
  • @SimonGarfe 是的。 head-&gt; 取消引用 head。取消引用空指针是非法的。
【解决方案2】:

头部为空。 您无法访问空对象的“下一个”字段。

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

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多