【问题标题】:How do you properly allocate a struct inside a function? [duplicate]如何在函数内正确分配结构? [复制]
【发布时间】:2015-05-08 20:47:56
【问题描述】:

我有这段代码,它是我缩小问题范围的地方。当我逐步使用调试器时,它似乎很好,但是一旦它离开函数,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;
    }

【问题讨论】:

    标签: c function malloc pass-by-value


    【解决方案1】:

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

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

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

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

    TREE *empList;
    initializeTree(&empList);
    

    另一种选择是返回指针:

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

    【讨论】:

    • 谢谢!这有帮助!但是如果我最初不将 empList 设为指针怎么办? TREE empList; initializeTree(&amp;empList); 而不是处理双指针。还是我需要让它成为一个双指针才能按我想要的方式工作?
    • @PatrickDixon 然后你必须从你的函数中删除行empList = (TREE *)malloc(sizeof(TREE));,因为你想直接对你给函数地址的结构进行操作,而不是对新分配的结构进行操作。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多