C语言链表在switch循环插入新节点时旧节点内容被覆盖问题
问题根因
你在主函数中接收用户输入时,重复使用了同一个字符数组(缓冲区)存储每次输入的字符串,而现有createNode函数仅直接存储传入的字符串指针,没有拷贝字符串内容:
- 所有动态创建的节点的
s成员都指向同一个缓冲区地址 - 每次输入新内容都会覆盖该缓冲区的旧数据,最终所有节点读取到的都是最后一次输入的内容
- 静态插入的字符串能正常显示,是因为字符串字面值存储在常量区,每个有独立的地址,不存在覆盖问题
修复方案
修改createNode函数,为每个节点的字符串独立分配内存,拷贝传入的字符串内容,而不是直接存储指针:
#include <string.h> // 需要引入string.h头文件使用strlen、strcpy Node *createNode(char *s) { Node *newNode = (Node *)malloc(sizeof(Node)); if (newNode == NULL) { perror("malloc node failed"); return NULL; } // 为字符串分配内存,长度+1存储字符串结束符'\0' newNode->s = (char *)malloc(strlen(s) + 1); if (newNode->s == NULL) { perror("malloc string failed"); free(newNode); return NULL; } // 拷贝字符串内容到独立内存 strcpy(newNode->s, s); newNode->next = NULL; return newNode; }
也可以直接用
newNode->s = strdup(s);实现同样效果,strdup会自动完成内存分配和字符串拷贝,使用后同样需要手动释放内存。
额外注意点
后续实现链表销毁逻辑时,需要先释放每个节点的s指向的内存,再释放节点本身,避免内存泄漏:
void freeList(Node *head) { Node *tmp; while (head != NULL) { tmp = head; head = head->next; free(tmp->s); free(tmp); } }
内容的提问来源于stack exchange,提问作者priyanka
相关产品推荐
相关产品推荐

