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