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

循环中如何保留结构体变量存储?链表节点销毁问题求助

问题根源

你代码里的链表节点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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:05:26