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

如何在C语言函数内正确为链表分配内存?我的代码仅生成一个节点

链表初始化错误分析与修正

问题根源

原代码的核心问题是没有将新分配的节点链接到前一个节点的next指针上:

  • 初始化第一个节点后,执行p = p->next时,p指向的是未初始化的野内存,并非有效指针
  • 后续循环中每次malloc新节点,仅给p赋值了新节点地址,但未与之前的节点建立关联,所有节点都是独立的内存块,只有第一个节点被*head指向,其他节点都成了无法访问的内存泄漏。

修正后的代码

#include <stdio.h>
#include <stdlib.h>

#define N 10

typedef struct node {
    int value;
    struct node *next;
} node_t;

void init_ll(node_t **head, int n)
{
    *head = NULL;
    node_t *current = NULL;

    for (int i = 0; i < n; i++) {
        // 分配新节点内存
        node_t *new_node = (node_t *)malloc(sizeof(node_t));
        if (new_node == NULL) {
            fprintf(stderr, "内存分配失败\n");
            return;
        }
        new_node->value = i;
        new_node->next = NULL;

        if (*head == NULL) {
            // 第一个节点,赋值给head
            *head = new_node;
            current = new_node;
        } else {
            // 将新节点链接到当前链表末尾
            current->next = new_node;
            current = new_node;
        }
    }
}

// 打印链表验证结果
void print_ll(node_t *head)
{
    node_t *p = head;
    while (p != NULL) {
        printf("%d ", p->value);
        p = p->next;
    }
    printf("\n");
}

// 释放链表内存,避免泄漏
void free_ll(node_t **head)
{
    node_t *temp;
    while (*head != NULL) {
        temp = *head;
        *head = (*head)->next;
        free(temp);
    }
}

int main(void)
{
    node_t *head;
    init_ll(&head, N);
    print_ll(head); // 输出:0 1 2 3 4 5 6 7 8 9

    free_ll(&head);
    return 0;
}

关键实现要点

  • 用current指针跟踪链表的最后一个节点,每次新节点分配后,将current->next指向新节点,再更新current为新节点,保证链表的连续性
  • 初始化时先将*head设为NULL,处理空链表的边界情况
  • 添加内存分配失败的判断,避免程序异常崩溃
  • 配套实现链表释放函数,使用完链表后及时回收内存,防止内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:10:31