链表节点数据地址重复及打印乱码问题咨询
问题分析与修复方案
看起来你遇到了两个关键问题:所有链表节点的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
相关产品推荐
相关产品推荐

