下面是我编写的C程序。它包含一个双重链表的实现。
#include <stdio.h>
/* node of a doubly linked list */
typedef struct _dlnode {
struct _dlnode* prev;
int key;
struct _dlnode* next;
} dlnode;
/* doubly linked list */
typedef struct _dllist {
dlnode* head;
dlnode* tail;
} dllist;
/* returns an empty doubly linked list */
dllist* empty_dllist () {
dllist* l;
l->head=NULL;
l->tail=NULL;
return l;
}
int main()
{
dllist* l;
l=empty_dllist ();
return 0;
}
我得到以下运行时错误:
Segmentation fault: 11
它是由什么引起的?
在使用指向该结构的指针访问其成员之前,必须为该结构分配内存。将函数empty_dllist
更改为-
dllist *empty_dllist(void) {
dllist *l = malloc(sizeof *l);
if(l == NULL) {
// failed to allocate memory
// handle it
// return NULL
}
l->head = NULL;
l->tail = NULL;
return l;
}
分段错误通常是由于试图跟随未初始化或NULL指针引起的。
在你的程序中,在函数empty_dllist中有一个指针变量l,你试着跟随这个指针找到它指向的东西。但是这个变量是未初始化的,并且包含垃圾,所以得到分段错误并不奇怪。
您可能想要在empty_dllist中添加对malloc的调用,为您的列表分配一个头结构体。
您没有分配内存:
dllist* l = malloc(sizeof(dllist));
所以尝试访问l->head会导致内存访问错误