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

C语言链表末尾追加结构体节点出现段错误,求解决方法

链表追加节点段错误的排查与修复

你的代码出现段错误主要是append函数存在两处关键逻辑错误,下面逐一分析并给出修复方案:

错误点分析

  • 无效覆盖传入节点+非法内存拷贝
    在append函数中,你重新调用malloc给参数i分配内存,直接丢弃了main函数里create_item创建好的节点;同时执行的strcpy(i->name, i->name)是将未初始化的内存内容拷贝到自身,完全无意义,还会导致数据异常。

  • 空链表场景下的空指针访问
    当链表初始为NULL时,你设置*list = i后没有终止函数,继续执行while(last->next != NULL)——此时last是NULL(因为last = *list是在if判断前执行的,当时*list还是NULL),访问last->next直接触发段错误。

修复后的代码

修正后的append函数

void append(struct item **list, struct item *i){
    // 确保新节点的next指针为NULL(create_item已经做了这一步,这里可作为双重保障)
    i->next = NULL;

    // 空链表直接将新节点设为头节点
    if(*list == NULL){
        *list = i;
        return; // 处理完空链表后直接返回,避免后续逻辑执行
    }

    // 非空链表,遍历找到最后一个节点
    struct item *last = *list;
    while(last->next != NULL) {
        last = last->next;
    }
    // 将新节点追加到末尾
    last->next = i;
}

完整可运行代码

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

struct item {
    char name[32];
    struct item *next;
};

struct item *create_item(char *name) {
    struct item *result = malloc(sizeof(struct item));
    strcpy(result->name, name);
    result->next = NULL;
    return result;
}

int equals(char *a, char *b) {
    return strcmp(a, b) == 0;
}

void append(struct item **list, struct item *i){
    i->next = NULL;

    if(*list == NULL){
        *list = i;
        return;
    }

    struct item *last = *list;
    while(last->next != NULL) {
        last = last->next;
    }
    last->next = i;
}

int main(void) {
    struct item *list = NULL;
    append(&list, create_item("Dog"));
    append(&list, create_item("Cat"));
    append(&list, create_item("Bat"));
    assert(equals(list->next->next->name, "Bat"));
    printf("断言通过,链表追加正常\n");

    // 释放内存,避免内存泄漏
    struct item *temp;
    while(list != NULL){
        temp = list;
        list = list->next;
        free(temp);
    }
    return 0;
}

额外说明

  • 修复后的代码让create_item负责创建并初始化节点,append专注于节点追加逻辑,职责划分更清晰。
  • 新增内存释放代码,避免程序结束后出现内存泄漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:00:56