2016-03-01 94 views
2

我已閱讀本tutorial,我不知道爲什麼內存分配給root爲什麼我們用int數據爲鏈表分配內存?

struct node { 
    int x; 
    struct node *next; 
}; 
struct node *root;  
root = malloc(sizeof(struct node)); 

我要說的是struct node *root;保證存儲在堆棧中未裝?這裏沒有未知的大小。此外,我們在同一幀中使用此節點。

+1

什麼記憶?什麼堆棧? 'struct node * root'正在做一件事 - 它分配一個*指針*,初始化爲'NULL'或者一些垃圾值(取決於聲明的方式)。 –

回答

2

你完全可以使用堆棧分配頭節點。然而這個例子也在考慮如何在創建後使用列表。如果你想在列表的開頭插入一個節點,它變得更加困難,因爲你現在必須覆蓋頭節點,而不是隻替換指針。這也使得名單更加同質化。您可以將指向您列表中任何節點的指針傳遞給另一個函數,並知道如何操作它。

3

我會說那個struct node * root;保證內存在堆棧中加載 否?這裏沒有未知的大小。而且,我們在同一幀中使用這個 節點。

不完全。 struct node *root;保證存在內存來保存指針struct node,但不是內存來保存節點本身。 malloc()正在爲節點分配足夠的空間,並且該節點的地址被放入root

+1

致OP。考慮指針恕我直言,最好的方法就是它只是一個存儲地址的uint32或uint64變量。但是,通過聲明它爲'node *',編譯器知道它正在查看「節點」的地址,而不是任何類型的數據。因此一個(void *)指針類型可以是任何東西。 –

2

struct node *root;給你(在一個函數,如果,如果在頂層,這是全球性的空間)堆棧空間的指針node,但它不會爲node本身分配內存。你可以在棧上聲明一個struct node root;(沒有指針),但是當函數返回時它會消失,並且用於釋放或變更鏈表的公共代碼可能假定所有節點都是動態分配的,如果嘗試freeroot

3

可能只是聲明它爲struct node root並使用它。但是它不是一個指針,它必須與其他節點區別對待。代碼一致性更好地處理所有相同的節點,包括根節點。

相關問題