Malloc 与创建数据结构

Malloc vs Creating a Data Structure

malloc 的用途是什么,而不仅仅是在 c 函数中创建结构?例如,这是在二叉搜索树中创建节点的模型代码。

void insertBSTNode(BTNode **node, int value)
{

    if (*node==NULL)
    {
        *node=malloc(sizeof(BTNode));
        (*node)->item =value;
        (*node)->left =NULL;
        (*node)->right = NULL;
        return;
    }
    if ((*node)->item > value)
        insertBSTNode(&((*node)->left), value);
    else if ((*node)->item <value)
        insertBSTNode(&((*node)->right), value);
    else
    {
        printf("Already exists in the BST\n");
        return;
    }
    return;
} 

我尝试做类似的事情,但改为创建结构,而不是像这样:

void insertBSTNode(BTNode **node, int value)
{
    if ((*node) == NULL){
        BTNode insert;
        insert.item = value;
        insert.left = NULL;
        insert.right = NULL;
        (*node) = &insert;
        return;
    }   
    
    else {
        int Nodeitem = (*node)->item;
        if (value>Nodeitem){
            insertBSTNode(&((*node)->right),value);
            return;
        }

        if (value<Nodeitem){
            insertBSTNode(&((*node)->left),value);
            return;
        }
    }
}

但 Nodeitem 始终是地址。为什么 malloc 在这种情况下有效?当我使用 BTNode insert,这与使用 malloc 而不是 &insert 只是指向内存位置不相似吗?那我应该改用 malloc 吗?

当使用 BTNode insert; 时,您正在使用堆栈中的内存。只要您只在 insertBSTNode 函数内部处理此数据,这就很好,但是一旦您离开该函数,堆栈内存就可以(并且将会)被其他函数使用。另一方面,malloc 使用堆内存,因此您可以在调用 malloc 的函数之外使用分配的内存,而不会有被其他函数覆盖的风险。您还必须记住,一旦您的应用程序不再需要使用 malloc 分配的内存,必须手动释放它。