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

结构体含指针的链表插入异常:旧访客数据被新数据覆盖

链表节点数据被覆盖的问题分析与解决

你的问题核心原因是:结构体中的char*成员直接复用了传入的字符串指针。所有链表节点里的SrNo、ticketNo等字段都指向同一个内存地址(比如调用addinfo时传入的临时缓冲区或重复使用的变量地址),当该地址的内容被新访客数据覆盖时,所有节点的对应字段都会同步显示最新内容。

修复方案

需要为每个节点的字符串字段分配独立内存,复制传入的字符串内容,而不是直接赋值指针。可以用两种方式实现:

方式1:使用strdup(简洁版)

strdup会自动分配足够内存并复制字符串,修改addinfo函数中的赋值逻辑:

tick *addinfo(tick *previous,char* serial,char* ticketno,char* name,char* id)
{
    tick *info = malloc(sizeof(tick));
    info->nextPtr = NULL;
    
    // 替换原指针赋值,改为复制字符串内容
    info->visitor.SrNo = strdup(serial);
    info->visitor.ticketNo = strdup(ticketno);
    info->visitor.Name = strdup(name);
    info->visitor.ID = strdup(id);

    if (previous != NULL)
    {
        previous->nextPtr = info;
    }

    printf("visitor info has been added: %s %s %s %s\n",info->visitor.SrNo,info->visitor.ticketNo,info->visitor.Name,info->visitor.ID);
    return info;
}

方式2:手动malloc+strcpy(兼容无strdup的环境)

如果系统不支持strdup,可以手动分配内存并复制字符串:

tick *addinfo(tick *previous,char* serial,char* ticketno,char* name,char* id)
{
    tick *info = malloc(sizeof(tick));
    info->nextPtr = NULL;
    
    // 为每个字符串分配内存并复制内容
    info->visitor.SrNo = malloc(strlen(serial) + 1);
    strcpy(info->visitor.SrNo, serial);

    info->visitor.ticketNo = malloc(strlen(ticketno) + 1);
    strcpy(info->visitor.ticketNo, ticketno);

    info->visitor.Name = malloc(strlen(name) + 1);
    strcpy(info->visitor.Name, name);

    info->visitor.ID = malloc(strlen(id) + 1);
    strcpy(info->visitor.ID, id);

    if (previous != NULL)
    {
        previous->nextPtr = info;
    }

    printf("visitor info has been added: %s %s %s %s\n",info->visitor.SrNo,info->visitor.ticketNo,info->visitor.Name,info->visitor.ID);
    return info;
}

额外注意事项

  • 销毁链表时,需先释放每个节点的char*成员内存,再释放节点本身,避免内存泄漏。
  • 建议检查malloc/strdup的返回值,确保内存分配成功,防止空指针异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:01:00