如何在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
相关产品推荐
相关产品推荐

