C语言链表开发:Donor链表所有id均为最后值问题排查
问题根源
你怀疑的链表插入代码是完全正确的,问题出在Donor节点的id赋值逻辑,以及打印函数的定义错误:
- 首先,你在while循环外定义了栈内存的二维数组
newString[10][10],整个循环过程中所有分割操作都复用同一块内存空间,每次循环都会覆盖newString里的旧内容。你直接把node->id = newString[0],相当于所有Donor节点的id指针都指向了同一个栈内存地址,等循环结束后这块地址里存的是最后一行的id值5,所以遍历打印的时候所有节点输出的都是5。 - 其次你的
print函数定义存在类型错误:函数接收的是Stored*类型参数,内部还访问了不存在的id属性(Stored结构体的成员是string不是id),你后面传入Donor*类型的head1调用属于非法操作,会引发未定义行为。
修复方案
- 给每个Donor节点的id分配独立的堆内存,替换直接赋值栈地址的逻辑:
把
node-> id = newString[0];
改为
node->id = strdup(newString[0]);
如果要兼容没有strdup的环境,也可以手动分配内存后复制:
node->id = malloc(strlen(newString[0]) + 1); strcpy(node->id, newString[0]);
- 单独实现Donor链表的打印函数,不要和Stored的打印逻辑混用:
void print_donor(Donor* head){ Donor* current_node = head; while(current_node!= NULL){ printf("%s\n", current_node->id); current_node = current_node->link; } }
后续打印Donor链表时调用print_donor(head1)即可。
- 补充内存释放逻辑:程序结束前遍历两个链表,分别释放每个节点的字符串成员和结构体本身,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Marvin Lee
相关产品推荐
相关产品推荐

