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

链表节点数据地址重复及打印乱码问题咨询

问题分析与修复方案

看起来你遇到了两个关键问题:所有链表节点的data指向同一个内存地址,以及append函数的链表遍历逻辑错误导致新节点无法正确添加,最终引发打印乱码。咱们一步步拆解解决:

1. 所有节点data地址相同的原因

你应该是在读取单词时,用了同一个缓冲区(比如一个固定的char数组)来临时存储每个单词,然后直接把这个缓冲区的指针传给append函数。因为每次读取新单词都会覆盖缓冲区的内容,而所有节点的data都指向这个缓冲区的地址,所以最后所有节点显示的都是最后一次写入的内容,且地址完全相同。

解决方法:每次生成新单词时,为它分配独立的内存空间,把单词内容复制进去,再将新内存的指针传给append。比如:

// 假设你读取到的单词存在buf数组中
char *word_copy = malloc(strlen(buf) + 1); // +1是为了存储字符串结束符'\0'
strcpy(word_copy, buf);
append(&my_list, word_copy);

2. append函数的逻辑错误

你的append函数在处理非空链表时,遍历逻辑完全错误:

  • while(list->next != NULL)的循环条件下,内部的if(list->next == NULL)永远不会成立,导致新节点根本没被添加到链表中
  • 循环里没有移动list指针,会陷入无限循环

修正后的append函数:

void append(linked_list *list, void *word) { 
    if(list->data == NULL) { 
        list->data = word; 
        list->next = NULL; 
        printf("WORD: %s\n", (char *)list->data); 
        printf("ADDRESS %p\n", list->data); 
    } else { 
        linked_list *new_node = malloc(sizeof(linked_list)); 
        new_node->data = word; 
        new_node->next = NULL; 

        // 遍历到链表的最后一个节点
        linked_list *current = list;
        while(current->next != NULL) {
            current = current->next;
        }
        // 将新节点挂到最后一个节点的next上
        current->next = new_node;

        printf("WORD: %s\n", (char *)new_node->data); 
        printf("ADDRESS %p\n", new_node->data); 
    } 
}

3. 打印乱码的解决

乱码主要是前两个问题导致的:要么所有节点指向的缓冲区被覆盖/释放,要么新节点根本没被添加到链表中(导致遍历到无效内存)。解决前两个问题后,乱码应该会消失。另外要注意:

  • 确保读取UTF-8文件时,缓冲区能正确存储多字节字符(如果你的单词包含非ASCII字符的话)
  • 不要提前释放存储单词的内存,直到链表不再使用时再逐个释放

额外建议

  • 记得在程序结束时,遍历链表释放每个节点的data和节点本身的内存,避免内存泄漏
  • 可以给linked_list结构体的data字段指定为char*,这样代码可读性更强(如果链表只存储字符串的话)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:27