为什么此代码会返回分段错误?
#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
。但是我得到了分段错误,为什么会这样呢?
答案 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
被丢弃。调用函数没有变化。