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
相关产品推荐
相关产品推荐

