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

C语言向LinkedList追加Struct对象时char*属性被覆盖问题求解

问题根因

该问题是典型的字符串浅拷贝导致的栈地址复用问题:

  • 你在main函数中定义的char eventName[256]是栈上的固定缓冲区,整个程序运行期间内存地址不会变化,每次循环执行sscanf都会覆盖该缓冲区的原有内容
  • 代码中直接使用event->name = eventName赋值,只是将eventName的栈地址拷贝给了每个EventObj的name指针,所有链表节点的name都指向同一块内存空间
  • int类型赋值正常是因为你拷贝的是int的数值本身,不是内存地址,不存在复用问题。
修复方案

只需要修改字符串赋值逻辑,为每个事件的名称单独分配堆内存存储即可,将循环内的event->name = eventName;替换为以下代码:

// 为字符串分配堆内存,+1是为了存储字符串结束符'\0'
event->name = (char*)malloc(strlen(eventName) + 1);
// 拷贝字符串内容到新分配的堆内存
strcpy(event->name, eventName);

如果你的编译环境支持POSIX标准,也可以直接调用strdup函数简化代码:

event->name = strdup(eventName);

注意:后续销毁链表释放资源时,需要先释放每个EventObj的name指向的堆内存,再释放EventObj本身,避免出现内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:24:00