我们需要为链表节点分配内存吗



到目前为止,我看到了启动节点的两种方法?

  1. Node c={6, NULL};
    Node b={3, &c};
    Node a={1, &b};
    Node *root = &a;
    
  2. Node * new_Node = (Node*)malloc(sizeof(Node));
    new_Node->data = 10;
    new_Node->next = &m;
    

哪个更好?哪一个是对的?

另一个问题是我们如何释放内存?

对于1,我们不需要释放mem,对吗?

对于2,对于下一个指针free(root->next)root->data=NULL,这是删除节点的正确方法吗?

两者都是正确的。第一种方法依赖于实例化堆栈上的对象并将它们分配给Node *,而后一种方法是实例化堆上的对象(使用malloc)。

free可以用于释放malloc分配的内存。

第一种情况下你是对的——你不需要释放内存。

在第二种情况下——链表——在free上创建一个包装器,在其中传递一个Node **,遍历链表直到得到NULL节点,保存下一个节点,然后将free保存为当前节点。最后,也可以选择将参数设置为NULL

对于#1,您不需要释放内存。局部变量在堆栈上。

free(root->next)

这不会解放一切。这只释放了一个节点。

两者都不是更好或正确的。这取决于你想做什么。决定因素是你是否知道在程序开始运行之前要创建多少对象。如果你这样做了,那么#1(在堆栈上创建局部变量)就可以了。例如,如果你确信你的节点永远不会超过100个,你可以创建一个大小为100的节点数组。

Node NodeList[100];

如果您事先不知道大小,则必须使用malloc/free来管理堆上的节点;

相关内容

  • 没有找到相关文章

最新更新