Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向链接列表指针的指针_C_Pointers_Linked List - Fatal编程技术网

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=然后
某个节点->下一步=当前节点