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

标签 c data-structures linked-list

我开始用 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/

相关文章:

c - 在 C(或可能是 C++)中记录 X-Macros 使用模式的好引用是什么?

css - 更好的 html 结构,用于将标题和侧边栏放在左侧栏中

c++ - 在现代 C++ 中实现专门的数据结构

c# - 随机顺序填充的最佳 C# 数据结构?

c++ - 内存释放双向链表C++

检查 if 语句中除法后的 int 是否为整数

c - 是 snprintf(NULL,0,...);行为规范?

c - 定义一个C程序编译后要修改的地址

java - 为链接列表创建 getLast 方法

python - 分离一个单链表,使得所有奇数节点一起出现,偶数节点一起出现