2015-09-05 34 views
0

我想在C中獲得更舒適的構建和使用鏈表,並且大部分我認爲我已經掌握了基礎知識。但是,我遇到了範圍方面的問題,特別是指針與指針結構之間的聯繫。範圍和鏈接列表C

在我的linked_list.c實現中,我使用main函數來測試和使用我構建的鏈表函數。但最終的目標是從另一個文件運行Main,並且只從頭文件引用外部需要的幾個函數。

我現在使用的實現工作,但它似乎依靠我宣佈struct list**在我的(臨時)main功能。

這是我的理解,如果你聲明一個塊外的變量/指針,你可以使用static命令控制鏈接爲內部的,可以被文件中的其他函數訪問。我想要做的就是從程序的外部調用void initialize_list()這樣的函數,並在內部初始化linked list**

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

struct node { 
    int value; 
    struct node *next; 
}; 

struct list { 
    struct node *head; 
    struct node *tail; 
    int size; // Maintains current size of list 
}; 

static struct list** work_list; 

void dirty_init(void){ 
    struct list* new_list = malloc(sizeof(struct list)); 
    new_list->head = NULL; 
    new_list->tail = NULL; 
    new_list->size = 0; 
    *work_list = new_list; 
} 

運行我的dirty_init函數返回段錯誤。

代碼的版本,它的工作頗爲相似,但似乎它傳遞給initialize_list之前依靠**work_listmain函數中所聲明。

void initialize_list(struct list **out_list){ 
    struct list* my_list = malloc(sizeof(struct list)); 
    my_list->head = NULL; 
    my_list->tail = NULL; 
    my_list->size = 0; 
    *out_list = my_list; 
} 
int main(void){ 
    int i; 
    struct list **work_list; 
    initialize_list(work_list); 
} 

這是一切都很好,但它使我的**work_list指針內部連接到主塊的缺點。任何想法,我錯了試圖讓dirty_init函數工作?

回答

2

此位置:

int main(void){ 
    int i; 
    struct list **work_list; 
    initialize_list(work_list); 
} 

不能工作。 C通過值傳遞,並傳遞一個未初始化的值,然後將其用作結果指針。你的意思是

int main(void){ 
    int i; 
    struct list *work_list; 
    initialize_list(&work_list); 
} 

改爲?

+1

啊,但它確實有效!我有一堆函數用於添加節點,並從我在initialize_list()函數後運行的列表中彈出,並且它們似乎都起作用。 – user3407513

+0

也許更好的方法來提出我的問題是,如何將dirty_init函數segfaults和initialize_list()版本做我認爲應該的? – user3407513

+2

@ user3407513不,它不起作用。它只是不會立即崩潰。爲了看到這一點,初始化'struct list ** worklist = NULL'並觀察'* out_list = my_list'解引用NULL指針。你的代碼隨機存儲器上塗寫。 – Jens