我正在尝试创建链接列表,然后将节点值回显到控制台。但是使用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;
}
答案 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中声明的指针,而不是创建副本。