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

C语言链表节点数据递归覆盖问题:结构体保存异常求助

看起来你踩了链表使用中一个非常常见的坑——所有节点的结构体数据被互相覆盖,我来帮你拆解问题根源和解决办法:

问题根源分析

你遇到的这个问题,几乎可以100%确定是所有链表节点的data指针都指向了同一块内存区域。举个典型场景:你可能在循环里重复使用同一个局部结构体变量,每次修改它的值后就把变量的指针传给listAdd,结果所有节点都指向这个局部变量的地址——而局部变量的内存会被后续循环反复覆盖,最后所有节点自然都显示最后一次修改的值。

从你给出的listAdd代码片段来看,函数只是把传入的data指针直接赋值给节点的data字段,并没有为每个节点复制一份独立的结构体数据。这就导致所有节点共享同一块内存,任何对这块内存的修改都会同步反映到所有节点上。

两种可行的解决方案

1. 为每个节点的结构体单独分配内存并复制数据(推荐)

这种方式最稳妥,每个节点持有自己独立的结构体副本,互不干扰。假设你的目标结构体是struct MyData,修改listAdd函数如下:

#include <string.h> // 用于memcpy内存复制

void listAdd(struct List *list, void *data, size_t dataSize) {
    // 1. 创建新节点并分配内存
    struct node *newNode = malloc(sizeof(struct node));
    if (!newNode) {
        perror("malloc node failed");
        return;
    }

    // 2. 为结构体分配独立内存并复制数据
    newNode->data = malloc(dataSize);
    if (!newNode->data) {
        perror("malloc data failed");
        free(newNode); // 避免节点内存泄漏
        return;
    }
    memcpy(newNode->data, data, dataSize);
    newNode->next = NULL;

    // 3. 将新节点加入链表尾部
    if (list->head == NULL) { 
        // 修正你原代码的风险:先判断head是否为空,再访问成员
        list->head = newNode;
    } else {
        struct node *temp_node = list->head;
        while (temp_node->next != NULL) {
            temp_node = temp_node->next;
        }
        temp_node->next = newNode;
    }
}

调用时需要传入结构体的大小:

struct MyData myData;
// 填充myData的字段数据
listAdd(myList, &myData, sizeof(struct MyData));

2. 确保每次传入的data都是独立内存地址

如果你不想在listAdd里做复制,那就要保证每次调用listAdd时,传入的data指向的是不会被重复使用的内存,比如每次都用malloc分配新的结构体:

// 调用示例
struct MyData *newData = malloc(sizeof(struct MyData));
if (newData) {
    // 填充newData的字段数据
    listAdd(myList, newData);
}

但这种方式需要你自己管理结构体的内存:在删除节点或销毁链表时,记得先free(node->data),再free(node),避免内存泄漏。

额外注意事项
  • 你原代码中list->head->data == NULL的判断逻辑有风险:如果链表为空(list->head是NULL),直接访问head->data会触发空指针异常,必须先判断head是否为空。
  • 销毁链表时,一定要遍历所有节点,先释放节点的data内存,再释放节点本身,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Kolt Penny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:54:15