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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:27:03