C语言 指向指向链接列表的指针的指针



为什么这段代码会返回分段错误?

#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);
}

按照我的逻辑,我给了一个指向 LinkedList 头部的指针。假设 LinkedList 的头部存储在 0x1 中,指向 0x1 的指针存储在 0x2 中。所以&head应该指向0x20x2指向0x1。我将0x2更改为点而不是0x555(新值)。所以&head仍然指向0x20x2指向0x555而不是现在0x1。但是我反而得到了细分错误,这是为什么?

问题是您将head取消引用到本地指针中,然后只修改该指针,而不是head指向的实际指针。

要修复:

void foo(Node **head) {
    *head = (Node*)malloc(sizeof(Node));
    (*head)->val = 5;
    (*head)->next = NULL;
}
curNode是一个

局部变量。foo()函数不会更改其范围之外的任何内容。

您将curNode设置为foo()第一行的某些内容没有任何好处,因为您会立即用返回值 malloc() 覆盖它。(您不检查其返回值,但这是另一个问题。

然后,foo()函数刚刚退出,curNode超出范围,这意味着curNode被丢弃。调用函数看不到任何变化。

相关内容

  • 没有找到相关文章

最新更新