为什么这段代码会返回分段错误?
#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
应该指向0x2
,0x2
指向0x1
。我将0x2
更改为点而不是0x555
(新值)。所以&head
仍然指向0x2
但0x2
指向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
被丢弃。调用函数看不到任何变化。