我不太清楚为什么这段代码不会创建一个包含5个节点的链表,每个节点都包含一个整数值。我目前正在收到段错误,并对发生错误的行进行了评论。任何帮助将不胜感激,谢谢。
struct node{
int val;
node * next;
}
int main(){
node ** head;
for(int i = 0; i < 5; i++){
node * temp = new node;
temp->val = i;
(*head)->next = temp; //segfault here
}
}
答案 0 :(得分:1)
head
不需要是指向指针的指针。它可以只是指向另一个node
的指针,它始终是链接列表中的第一个node
。 head
也应初始化为null
。
答案 1 :(得分:1)
在您的代码中,head
是一个双指针。 head
指向的指针没有构造对象,可能是null
,因此您的分段错误。
我建议您保留head
一个简单的指针,而不是双指针,因为这是不必要的。
答案 2 :(得分:0)
尝试这个,它应该工作。你仍然需要编写代码来分配内存。
struct node{
int val;
node * next;
};
int main(){
node * head = new node();
head->val = 999;
node *curr=head;
for(int i = 0; i < 5; i++) {
node* temp = new node();
temp->val = i;
cout << "adding node " << i << endl;
curr->next = temp; //segfault here
curr = curr->next;
}
return 0;
}
答案 3 :(得分:0)
你尝试在程序中使用“node ** head”做的第一件事是取消引用它,假设head是未初始化值的指针,如果你试图触摸任何数据,很可能会破坏你的程序那个位置。正确的做法是在尝试下一步之前设置* head = temp。
此外,您不需要使用双指针初始化列表,以便稍后利用双指针插入算法。你总能说 节点** head_pp =&amp; head并从那里开始。
现在,您的代码看起来像这样。
节点**头 (存储未经初始化的任何内容)
*头
(未初始化的记忆)
(*头) - &gt;接着 (尝试触摸未初始化的内存地址,操作系统杀死程序)
应该注意的是,在大多数情况下,您将收到段错误,因为大多数uninit内存保持0。最终你会看到访问冲突,但