C 指向链接列表指针的指针
为什么此代码返回分段错误C 指向链接列表指针的指针,c,pointers,linked-list,C,Pointers,Linked List,为什么此代码返回分段错误 #include <string.h> #include <stdio.h> #include <stdlib.h> typedef struct node { struct node * next; int val; } Node; void foo(Node **head) { Node * curNode = *head; curNode = malloc(sizeof(Node));
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
struct node * next;
int val;
} Node;
void foo(Node **head) {
Node * curNode = *head;
curNode = malloc(sizeof(Node));
curNode->val = 5;
curNode->next = NULL;
}
int main() {
Node * head = NULL;
foo(&head);
printf("Val %d", head->val);
}
#包括
#包括
#包括
类型定义结构节点{
结构节点*下一步;
int-val;
}节点;
无效foo(节点**头){
节点*curNode=*头部;
curNode=malloc(sizeof(Node));
curNode->val=5;
curNode->next=NULL;
}
int main(){
Node*head=NULL;
foo&head;
printf(“价值%d”,表头->价值);
}
按照我的逻辑,我给出了一个指向LinkedList头部的指针。假设LinkedList的头存储在
0x1
,而指向0x1
的指针存储在0x2
中。因此&head
应指向0x2
,0x2
应指向0x1
。我将0x2
更改为点,而不是0x555
(新值)。所以&head
仍然指向0x2
,但是0x2
现在指向0x555
,而不是0x1
。但我得到的是分段错误,这是为什么?curNode
是一个局部变量。foo()
函数不会更改其范围之外的任何内容
将curNode
设置为foo()
第一行的某个值没有任何好处,因为您立即用malloc()
的返回值覆盖它。(您不会检查的返回值,但这是另一个问题。)
然后,
foo()
函数刚好退出,curNode
超出范围,这意味着curNode
被丢弃。调用函数看不到任何更改。问题是您正在将头
解引用到一个本地指针中,然后只修改该指针,而不是头
所指向的实际指针
要修复:
void foo(Node **head) {
*head = (Node*)malloc(sizeof(Node));
(*head)->val = 5;
(*head)->next = NULL;
}
您无法访问0x555,因为它可能不在分配的内存地址范围内。您是否使用调试器跟踪代码?
curNode->next=NULL代码>-->curNode->next=NULL*头部=颈淋巴结代码>我明白了,但是我如何遍历并在LinkedList的末尾插入一个节点呢?我需要将某个临时变量设置为curNode
,这与我现在所做的类似。您仍然可以使用临时变量来构造节点。但是,当需要将其实际插入列表时,需要使用列表中节点引用的指针。所以你可以做cur_node=代码>然后某个节点->下一步=当前节点代码>