指向LinkedList的指针

时间:2016-02-23 07:50:41

标签: 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));
    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仍然指向0x2,但0x2现在指向0x555而不是0x1。但是我得到了分段错误,为什么会这样呢?

2 个答案:

答案 0 :(得分:3)

问题是你将head解引用到本地指针中,然后只修改那个 - 而不是实际的指针head指向。

修复:

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

答案 1 :(得分:2)

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

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

然后,foo()函数退出,curNode超出范围,这意味着curNode被丢弃。调用函数没有变化。