2016-03-01 96 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并使用它。但是它不是一个指针,它必须与其他节点区别对待。代码一致性更好地处理所有相同的节点,包括根节点。

相关问题