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

C语言链表插入整数指针节点后数据显示异常求助

C语言链表插入整数指针节点后数据显示异常求助

看起来你遇到的问题是链表节点里存的数据指针指向了栈上的局部变量,导致后续访问时数据变成了垃圾值,我来帮你分析一下并解决这个问题~

问题根源

你的insertDataToEndList函数里,传入createNewListNode的是&data——这里的data是函数的形参,属于栈上的局部变量。当insertDataToEndList执行完毕,这个局部变量的内存空间会被系统回收,后续再访问节点的dataPtr时,指向的就是已经被释放的栈内存,里面的内容是不确定的垃圾值,所以打印出来的结果和你输入的完全不符。

修正方案

我们需要为每个节点的数据单独分配堆内存,而不是直接用局部变量的指针。这里给你两种可行的修改方式:

方式一:让createNewListNode负责数据的内存分配

这种方式更直观,把数据值传入函数,由函数内部为数据分配堆内存并复制值:

// 调整函数参数,直接传入int值而非指针
ListNode* createNewListNode(int data, ListNode* next)
{
    ListNode* res = (ListNode*)malloc(sizeof(ListNode));
    // 为数据单独分配堆内存
    res->dataPtr = (int*)malloc(sizeof(int));
    *res->dataPtr = data; // 把值复制到堆内存里
    res->next = next;
    return res;
}

// 对应修改insertDataToEndList,直接传入data值
void insertDataToEndList(List* lst, int data)
{
    ListNode* newTail = createNewListNode(data, NULL);
    insertNodeToEndList(lst, newTail);
}

方式二:在insertDataToEndList里提前分配数据内存

如果你想保留createNewListNode原有的参数形式,可以在调用它之前先为数据分配堆内存:

void insertDataToEndList(List* lst, int data)
{
    // 为数据分配堆内存,把输入的data值复制进去
    int* dataHeap = (int*)malloc(sizeof(int));
    *dataHeap = data;
    // 传入堆内存的指针
    ListNode* newTail = createNewListNode(dataHeap, NULL);
    insertNodeToEndList(lst, newTail);
}

这种方式下你的createNewListNode可以保留原来的代码,但要注意后续释放内存的逻辑。

重要注意事项

不管用哪种方式,后续的freeList函数必须同时释放节点本身和dataPtr指向的堆内存,否则会造成内存泄漏。你的freeList应该改成这样:

void freeList(List* lst)
{
    ListNode* curr = lst->head;
    ListNode* nextNode;
    while (curr != NULL)
    {
        nextNode = curr->next;
        // 先释放数据指针指向的堆内存
        free(curr->dataPtr);
        // 再释放节点本身
        free(curr);
        curr = nextNode;
    }
    // 清空链表的头尾指针
    lst->head = NULL;
    lst->tail = NULL;
}

备注:内容来源于stack exchange,提问作者astralvampx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 10:28:07