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
相关产品推荐
相关产品推荐

