创建链表触发segmentation fault,请求问题定位与解决
两段链表代码的段错误原因分析
第一段代码的问题
这段代码存在三个核心错误,直接导致段错误:
- 内存分配大小错误:
malloc(sizeof(new))中,new是指针类型,sizeof(new)仅分配了指针的字节数(通常4/8字节),远小于struct node的实际大小。后续访问new->DATA和new->LINK会越界访问非法内存,引发未定义行为。 - 头指针值传递无效:
create函数的head是值传递,函数内修改head = new只会改变局部变量,不会影响main里的former指针。main中的former始终是NULL,执行printf("%i", former->DATA)时直接访问空指针的成员,触发段错误。 - malloc失败未终止:如果
malloc返回NULL,后续仍然执行new->DATA=item,访问空指针的成员,同样会导致段错误。
第一段错误代码:
#include <stdio.h> #include <stdlib.h> typedef struct node { int DATA; struct node* LINK; } node; void create(struct node* head, int item){ struct node* new; new = (struct node*)malloc(sizeof(new)); // 错误:分配大小不对 if (new == NULL){ printf("Memory not Available"); // 错误:未终止函数,后续仍会操作new } new->DATA=item; new->LINK = NULL; if (head == NULL){ head = new; // 错误:值传递,修改不影响外部 }else { struct node* temp; temp = head; while(temp->LINK != NULL){ temp = temp->LINK; } temp->LINK=new; } } int main(){ node* former = NULL; int itm = 7; create(former, itm); printf("%i", former->DATA); // 错误:former还是NULL,访问空指针成员 return 0; }
修改后代码的问题
改成指针的指针后,依然存在多个错误:
- 错误初始化
*head = NULL:函数开头直接把*head设为NULL,清空了传入的头指针状态,且导致后续逻辑错误。 - 判断条件错误:
if (head == NULL)判断的是指针的指针本身是否为空,但main中传入的是&former,不可能为空,所以永远走else分支。而else分支里temp = *head(此时*head被设为NULL),执行while(temp->LINK != NULL)时访问空指针的成员,触发段错误。 - 链表为空时的处理错误:即使条件正确,
head = &new修改的是形参head本身,不会影响外部的&former,正确写法应该是*head = new。 - malloc失败未终止:同样,
malloc返回NULL后继续操作new的成员,会访问空指针。
修改后错误代码:
void create(node** head, int item){ *head = NULL; // 错误:强制清空头指针 node* new; new = (node*)malloc(sizeof(*new)); if (new == NULL){printf("Memory not Available");} // 错误:未终止函数 new->DATA=item; new->LINK = NULL; if (head == NULL){head = &new;} // 错误:判断条件错,且修改形参无效 else { node* temp; temp = *head; // temp此时是NULL while(temp->LINK != NULL){ // 错误:访问NULL的LINK成员 temp = temp->LINK;} temp->LINK=new;}} int main(){ node* former; int itm = 7; create(&former, itm); printf("%i", former->DATA); return 0; }
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

