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

时间:2015-03-07 07:22:11

标签: c function malloc 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;
    }

2 个答案:

答案 0 :(得分:4)

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

C没有通过引用传递的参数,但可以使用指针进行模拟。因此,要通过引用传递指针,您需要将指针传递给指针。

void initializeTree(TREE** empList)
{
    *empList = malloc(sizeof(TREE));
    ...
    (*empList)->freeCount = maxEmp;
    ...
}

要调用此函数,您需要使用address-of运算符&

TREE *empList;
initializeTree(&empList);

另一种选择是返回指针:

TREE* initializeTree(void)
{
    TREE* empList = malloc(sizeof(TREE));
    ...
    return empList;
}

答案 1 :(得分:0)

您正在覆盖函数中empList的值,但它没有到达调用者。你真正需要做的是传入指向树指针的指针:

void initializeTree(TREE** empList)
{
    *empList = (TREE *)malloc(sizeof(TREE));
    [...]
}

您还可以找到更多信息(和其他选项)here