使用函数创建链表时出现分段错误

时间:2014-04-07 14:57:57

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

我正在尝试创建链接列表,然后将节点值回显到控制台。但是使用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;
}

2 个答案:

答案 0 :(得分:2)

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

在C ++中,除非另有说明,否则所有内容都按值传递。在这种情况下,您通过值将指向节点(start)的指针传递给createList 。您正在使用副本时,可以更改它指向的节点(start->...),但不能更改指针本身。

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

答案 1 :(得分:1)

您通过值将start参数传递给函数createList,这意味着当您执行

start = new node;

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

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

void createList(node*& start)

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