循环中如何保留结构体变量存储?链表节点销毁问题求助
问题根源
你代码里的链表节点struct node new是栈上的局部变量,栈内存的生命周期仅限于当前循环迭代——每次循环结束,栈帧回退,这块内存就被标记为可用,下一次循环创建的新变量大概率会复用同一块地址。这就导致链表所有节点的指针最终都指向同一块失效的内存,自然只能看到最后一次输入的内容。
解决方案:用动态内存分配(堆内存)
要让节点在循环结束后不被销毁,得把节点分配在堆内存上,用malloc函数申请内存,堆上的内存不会随栈帧销毁而释放,直到你手动调用free释放。
修改后的代码
#include <stdio.h> #include <string.h> #include <stdlib.h> // 包含malloc和free的头文件 struct node { char value[30]; struct node *next; }; int main() { struct node *current = NULL; struct node *head = NULL; while (1) { char input[30]; scanf("%29s", input); // 数组名本身是指针,无需加& if (strcmp(input, "exit") == 0) break; // 动态分配节点内存 struct node *new_node = malloc(sizeof(struct node)); if (new_node == NULL) { // 检查内存分配是否成功 fprintf(stderr, "内存分配失败\n"); // 清理已分配节点后退出 struct node *temp; while (head != NULL) { temp = head; head = head->next; free(temp); } return 1; } // 安全复制输入字符串到节点 strncpy(new_node->value, input, sizeof(new_node->value) - 1); new_node->value[sizeof(new_node->value) - 1] = '\0'; // 确保字符串结尾合法 new_node->next = NULL; // 初始化next指针,避免野指针 if (head == NULL) { head = new_node; } else { current->next = new_node; } current = new_node; } // 验证链表内容(可选) struct node *temp = head; printf("链表存储的内容:\n"); while (temp != NULL) { printf("%s\n", temp->value); temp = temp->next; } // 释放所有节点,避免内存泄漏 temp = head; while (head != NULL) { temp = head; head = head->next; free(temp); } return 0; }
关键修改点说明
- 引入
<stdlib.h>:malloc和free函数的定义在这个头文件中,必须包含才能使用。 - 动态分配节点:
malloc(sizeof(struct node))在堆上申请刚好容纳一个struct node的内存,返回指向该内存的指针,这块内存不会随循环结束被销毁。 - 检查分配结果:如果内存不足,
malloc会返回NULL,必须处理这种情况,避免后续操作野指针导致程序崩溃。 - 初始化
next指针:新分配的堆内存内容是随机的,手动把next设为NULL,防止链表出现无效指针。 - 安全复制字符串:用
strncpy替代strcpy,避免输入过长导致数组越界,最后手动添加字符串结束符保证格式合法。 - 释放内存:程序结束前遍历链表,用
free释放每个节点的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者mkdrive2
相关产品推荐
相关产品推荐

