gpt4 book ai didi

c - 将头节点添加到单链表会产生段错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:16 24 4
gpt4 key购买 nike

我开始用 C 编写这个非常简单的函数,将节点添加到头部的单链表。这是我的功能。 head 参数是指向链表第一个节点的指针。如果链表为空,它可以作为 NULL 出现。 data 是要放入要添加的新节点的数据字段中的数字:

Node* InsertAtHead(Node *head, int data)
{
Node newHeadNode;
newHeadNode.data = data;
newHeadNode.next = NULL;

if (head == NULL)
{
head = &newHeadNode;
}
else
{
newHeadNode.next = head;
head = &newHeadNode;
}

return head;
}

Head的定义如下:

struct Node
{
int data;
struct Node *next;
};

这适用于我的机器,但不适用于我同事的机器。在另一台机器上,程序给出了段错误。我的功能有什么问题?

最佳答案

您的函数返回一个具有自动存储(又名在堆栈上)newHeadNode 的局部变量的地址。在程序的其余部分使用它会调用未定义的行为。您应该改为使用 malloc() 分配节点并返回指向分配对象的指针:

#include <stdlib.h>

Node *InsertAtHead(Node *head, int data) {
Node *node = malloc(sizeof(*node));
if (node != NULL) {
node->data = data;
node->next = head;
}
return node;
}

记得把返回值存入链表的堆指针中,除非是NULL。另一个更安全的 API 是这样的:

Node *InsertAtHead(Node **head, int data) {
Node *node = malloc(sizeof(*node));
if (node != NULL) {
node->data = data;
node->next = *head;
*head = node; // update the head pointer
}
return node;
}

使用此 API,您可以传递头指针的地址,只有在分配成功时才会更新。

关于c - 将头节点添加到单链表会产生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40319672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com