我想在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_list
我main
函數中所聲明。
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
函數工作?
啊,但它確實有效!我有一堆函數用於添加節點,並從我在initialize_list()函數後運行的列表中彈出,並且它們似乎都起作用。 – user3407513
也許更好的方法來提出我的問題是,如何將dirty_init函數segfaults和initialize_list()版本做我認爲應該的? – user3407513
@ user3407513不,它不起作用。它只是不會立即崩潰。爲了看到這一點,初始化'struct list ** worklist = NULL'並觀察'* out_list = my_list'解引用NULL指針。你的代碼隨機存儲器上塗寫。 – Jens