我已阅读此tutorial,我想知道为什么会为root
分配内存:
struct node {
int x;
struct node *next;
};
struct node *root;
root = malloc( sizeof(struct node) );
我会说struct node *root;
保证内存加载到堆栈中没有?这里没有未知的大小。此外,我们在同一帧中使用此节点。
答案 0 :(得分:3)
我会说struct node * root;保证加载内存 在堆栈中没有?这里没有未知的大小。而且,我们用这个 同一帧中的节点。
不完全。 struct node *root;
保证有一个内存可以将指针保存到struct node
,而不是内存来保存节点本身。 malloc()
为节点分配足够的空间,该节点的地址放在root
中。
答案 1 :(得分:3)
您可以将其声明为struct node root
并使用它。但是它不是一个指针,它必须与其他节点区别对待。代码一致性最好将所有节点都视为相同,包括根节点。
答案 2 :(得分:2)
struct node *root;
为你提供一个指针到node
的堆栈空间(如果在函数中,如果在顶层,它是全局空间),但它没有' t为node
本身分配内存。您可以在堆栈上声明struct node root;
(没有指针),但是当函数返回时它会消失,并且用于释放或改变链表的公共代码可能会假设所有节点都是动态分配的,如果是尝试free
root
。{/ p>
答案 3 :(得分:2)
你可以使用堆栈分配的头节点,这是完全正确的。但是,该示例还考虑了在创建列表后如何使用列表。如果要在列表的开头插入节点,则会变得更加困难,因为您现在必须覆盖头节点而不是仅替换指针。它还使列表更加同质。您可以将指向列表中任何节点的指针传递给另一个函数,它将知道如何操作它。