You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双向链表添加首节点时次级节点数据被垃圾值覆盖问题求助

双向链表节点数据被随机覆盖的问题排查与修复

你的问题根源出在节点内存分配的大小计算错误,直接导致内存越界写入,覆盖了节点数据。

错误原因

在createListNode函数中,你使用sizeof(struct node*)来计算分配的内存大小:

struct node* newNode = (struct node*)calloc(1, sizeof(struct node*));

struct node*是指针类型,大小通常为4或8字节(取决于系统架构),但你的struct node结构体包含一个int类型的data和两个指针成员,实际需要的内存远大于单个指针的大小。分配的内存空间不足以容纳整个节点,后续对节点成员的写入操作会越界,破坏相邻内存区域的数据——这就是为什么你看到次级节点的数据变成垃圾值。

当执行(*list)->previous = newNode时,写入操作进一步越界,直接覆盖了之前节点的data字段,触发了你观察到的问题。

修复方案

将内存分配的大小修正为sizeof(struct node),确保分配足够的空间容纳整个节点结构体:

static struct node* createListNode(const Data data)
{
    // 修正为分配整个结构体的内存
    struct node* newNode = (struct node*)calloc(1, sizeof(struct node));
    
    if (newNode == NULL)
    {
        printf("Error");
        return NULL;
    }
    else
    {
        newNode->data = data;
        newNode->next = NULL;
        newNode->previous = NULL;
        return newNode;
    }
}

额外注意

另外,testFunction中List head是值传递,虽然当前测试场景下不影响功能,但如果后续需要修改外部传入的链表头,建议改为指针传递(不过这不是当前问题的诱因)。

内容的提问来源于stack exchange,提问作者Linnea Fries

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:30:53