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

创建链表触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:55:10