地址边界错误:C语言链表节点无法正确添加的问题排查
C语言链表追加元素失败的问题修复
问题根源分析
新节点未接入链表
在appendToList函数中,你使用while (current != NULL)遍历链表,最终current会指向NULL。之后你虽然分配了新节点的内存,但没有将它与链表的最后一个节点建立关联——链表尾节点的next指针始终为NULL,新节点完全游离在链表结构之外。这直接导致L->head->next一直是NULL,访问它的value时触发段错误。长度计算逻辑错误
初始length = 1,遍历循环中每次current != NULL就执行length++,对于仅含头节点的链表,循环会执行1次(current从head变为NULL),length变为2,之后追加新节点又执行length++变为3,这与实际链表长度完全不符。
修正后的代码
重点修改appendToList函数,同时优化main中的取值逻辑:
#include <malloc.h> #include <stdio.h> #include <stdlib.h> typedef struct element { int value; struct element* next; } element; typedef struct list { element* head; } list; list* createList(int headValue) { list* L = malloc(sizeof(list)); L->head = malloc(sizeof(element)); L->head->value = headValue; L->head->next = NULL; return L; } // Returns the new length of the list int appendToList(list* L, int value) { element* current = L->head; int length = 1; if (current == NULL) { printf("list is empty\n"); exit(2); } // 遍历到链表的最后一个节点(而非NULL) while (current->next != NULL) { current = current->next; length++; } // 分配新节点并初始化 element* newNode = malloc(sizeof(element)); newNode->next = NULL; newNode->value = value; // 将新节点链接到链表尾部 current->next = newNode; length++; return length; } // returns the value at index N (zero based) // // If the list has < N elements, returns -1 int getAtIndexN(list* L, int N) { element* current = L->head; for (int i=0; i<N; i++) { if (current->next == NULL) { printf("unable to get to index %d\n", i+1); return -1; } current = current->next; } return current->value; } int main(int args, char** argv) { int initvalues[] = {1,3,4,4}; list* L = createList(5); for (int i=0; i<4; i++) { appendToList(L, initvalues[i]); } // 使用安全的getAtIndexN函数获取值,避免直接访问指针 printf("element at index 1 has value %d\n", getAtIndexN(L, 1)); return 0; }
关键修改点说明
- 遍历条件改为
current->next != NULL,确保current最终停在链表的最后一个有效节点上。 - 新增
newNode变量存储新分配的节点,避免覆盖current指针导致丢失尾节点引用。 - 通过
current->next = newNode将新节点正式接入链表。 - 修正长度计算逻辑,使其与实际节点数量一致。
main中改用getAtIndexN函数获取值,避免直接访问未初始化的指针引发崩溃。
内容的提问来源于stack exchange,提问作者user21025014
相关产品推荐
相关产品推荐

