0

下面是我寫的C程序。它包含雙向鏈表的實現。雙鏈表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 

它是什麼引起的?

回答

1

您有一個結構,你使用它的指針訪問之前分配內存其成員。將您的功能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; 
} 
0

分段錯誤通常是由於嘗試跟隨未初始化的或NULL指針引起的。

在你的程序中,你有指針變量在功能empty_dllist,並嘗試遵循指向它指向。但是這個變量是未初始化的,而且還有一些垃圾,所以你得到分段錯誤並不奇怪。

你可能想來電empty_dllist添加到的malloc,分配爲您的列表頭結構。

0

你是不是分配內存:

dllist* l = malloc(sizeof(dllist)); 

所以試圖訪問1->頭會導致錯誤的內存訪問