如何在函数内正确分配结构体?

1 c malloc function pass-by-value

我有这段代码,这是我缩小问题范围的地方。当我使用调试器单步执行时,似乎没问题,但一旦它离开函数, freeCount 就会丢失分配给它的值。它应该是 100,直到最后一个 } 它显示它分配的值很好,但一旦函数中断,它就会返回到某个 16 位值。谁能指出我的错误?非常感激!

   void initializeTree(TREE* empList)
   {
        empList = (TREE *)malloc(sizeof(TREE));
        int i;
        for (i = 1; i <= maxEmp; i++)
        {
            time_t seed = time(null);
            empList->freeList[i] = (int)(rand() % seed);
        }
        empList->freeCount = maxEmp;
        empList->parent = null;
        empList->root = null;
    }
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 5

这是因为在 C 中,函数的参数是按值传递的,这意味着它们是被复制的。因此,当您将指针传递给函数时,函数会收到指针的副本,并且如您所知,更改副本不会更改原始指针。

C 没有通过引用传递参数,但可以使用指针来模拟。因此,要通过引用传递指针,您需要传递一个指向该指针的指针。

void initializeTree(TREE** empList)
{
    *empList = malloc(sizeof(TREE));
    ...
    (*empList)->freeCount = maxEmp;
    ...
}
Run Code Online (Sandbox Code Playgroud)

要调用此函数,您需要使用地址运算符&

TREE *empList;
initializeTree(&empList);
Run Code Online (Sandbox Code Playgroud)

另一种选择是返回指针:

TREE* initializeTree(void)
{
    TREE* empList = malloc(sizeof(TREE));
    ...
    return empList;
}
Run Code Online (Sandbox Code Playgroud)