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

C语言实现双向链表(DLL)出现段错误,如何正确初始化head指针?

段错误原因

你遇到的段错误本质是访问了未初始化的野指针,核心问题有两个:

  • 你通过typedef struct LL *LL把LL定义成了「指向链表结构体的指针」类型,你在main里声明的LL list只是一个指针变量,没有为它指向的struct LL结构体分配内存,直接解引用list->head属于访问非法内存,自然触发段错误。
  • 你的CREATE_NODE函数里malloc的大小也写错了:sizeof(node)计算的是指针的大小(通常32位系统4字节、64位系统8字节),而非struct node结构体的实际大小,后续给node成员赋值也会有内存越界风险。

初始化head的实现方案

方案1:单独封装链表初始化函数(推荐)

先为struct LL分配内存,再把内部的head初始化为NULL,示例代码如下:

LL INIT_LIST() {
    LL l = (LL)malloc(sizeof(struct LL));
    if (l == NULL) {
        exit(0);
    }
    l->head = NULL;
    return l;
}

同时修复CREATE_NODE的内存分配错误:

node CREATE_NODE(int k)
{
    node temp;
    // 把sizeof(node)改成sizeof(struct node),分配整个节点结构体的内存
    temp = (node)malloc(sizeof(struct node));
    if (temp == NULL)
        exit(0);
    temp->data = k;
    temp->next = NULL;
    // 顺便把prev也初始化为NULL,避免野指针
    temp->prev = NULL;
    return temp;
}

main函数调用示例:

int main()
{
    LL list = INIT_LIST(); // 先初始化链表结构体,再操作
    // 后续可以正常调用INSERT函数
    INSERT(list, 10);
    INSERT(list, 20);
    // 用完记得释放内存避免泄漏,此处省略释放逻辑
    return 0;
}

方案2:直接在main内完成初始化

如果不想单独封装初始化函数,也可以直接在main里完成内存分配和head初始化:

int main()
{
    LL list = (LL)malloc(sizeof(struct LL));
    if (list == NULL) exit(0);
    list->head = NULL;
    // 后续业务逻辑
    return 0;
}

额外优化建议

你当前的typedef把指针类型直接命名为node和LL,很容易和结构体本身混淆,后续维护很容易出指针相关bug,建议调整命名风格:

  • 把typedef struct node *node改成typedef struct node *node_ptr
  • 把typedef struct LL *LL改成typedef struct LL *list_ptr
    这样能清晰区分结构体本身和指针类型,减少编码错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:15:04