如何在函数内正确分配结构? [复制]

Posted

技术标签:

【中文标题】如何在函数内正确分配结构? [复制]【英文标题】: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;
    

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于如何在函数内正确分配结构? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何访问指向结构的指针的成员? [复制]

C语言如何给指针分配内存?

vector 如何在特定位置调用复制构造函数?

如何在函数内将变量分配给合并的 Pandas 数据框

如何逐字读取文件并将这些单词分配给结构? [复制]

如何在函数中重新分配结构数组