【问题标题】:Segmentation fault when creating linked list with function使用函数创建链表时出现分段错误
【发布时间】:2014-05-19 21:49:57
【问题描述】:

我正在尝试创建一个链接列表,然后将节点值回显到控制台。但是使用main 函数之外的函数并调用它会导致segmentation fault(core dumped)。我不知道为什么。 以下代码有效:

#include<iostream>
using std::cout;
using std::endl;

struct node
{
    int val;
    node* next;
};

void printList(node* start)
{
    node* temp; 
    temp = start;
    int i = 0;
    while(temp->next != NULL)
    {
        cout<<"The value in the "<<i<<"th node is : "<<temp->val<<endl;
        temp = temp->next;
        i++;
    }
}
int main() 
{
    node* start;
    node* temp;
    start = new node;
    temp = start;
    for(int i = 0; i < 10; i++)
    {
        temp->val = i*10;
        temp->next = new node;
        temp = temp->next;
    }
    temp->val = 0;
    temp->next = NULL;
    printList(start);
    return 0;
}

但这会引发分段错误

#include<iostream>
using std::cout;
using std::endl;

struct node
{
    int val;
    node* next;
};
void createList(node* start)
{
    node* temp;
    start = new node;
    temp = start;
    for(int i = 0; i < 10; i++)
    {
        temp->val = i*10;
        temp->next = new node;
        temp = temp->next;
    }
    temp->val = 0;
    temp->next = NULL;
}
void printList(node* start)
{
    node* temp; 
    temp = start;
    int i = 0;
    while(temp->next != NULL)
    {
        cout<<"The value in the "<<i<<"th node is : "<<temp->val<<endl;
        temp = temp->next;
        i++;
    }
}
int main() 
{
    node* start;
    createList(start);
    printList(start);
    return 0;
}

【问题讨论】:

  • 一个简单的调试会话会告诉您,在调用 createList 之后“start”的值没有改变。那么你会问一个更集中的问题,例如“为什么 createList 返回时不开始更改值?”
  • 哦。是的。我会从下次开始做。 :)

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


【解决方案1】:

void createList(node* start) 更改为void createList(node*&amp; start)。 (See it work)。

在 C++ 中,除非另有说明,否则一切都是按值传递的。在这种情况下,您将一个指向节点 (start) 的指针传递给 createList 按值。您可以更改它指向的节点 (start-&gt;...),但不能更改指针本身,因为您正在使用副本。

通过引用传递指针允许您更改指针本身。

【讨论】:

    【解决方案2】:

    您将start 参数按值传递给函数createList,这意味着当您这样做时

    start = new node;
    

    start副本 被分配了新节点的地址。这意味着您在main 中声明的start 变量没有接收到节点的地址。

    要解决此问题,请使用指针引用。通过引用而不是按值将 start 传递给 createList。像这样:

    void createList(node*& start)
    

    当您通过引用传递时,您是在直接更改您在 main 中声明的指针,而不是创建一个副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-25
      • 2021-12-10
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2012-10-31
      相关资源
      最近更新 更多