如何在函数内正确分配结构? [复制]
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;
...
要调用此函数,您需要使用地址运算符&
:
TREE *empList;
initializeTree(&empList);
另一种选择是返回指针:
TREE* initializeTree(void)
TREE* empList = malloc(sizeof(TREE));
...
return empList;
【讨论】:
谢谢!这有帮助!但是如果我最初不将 empList 设为指针怎么办?TREE empList; initializeTree(&empList);
而不是处理双指针。还是我需要让它成为一个双指针才能按我想要的方式工作?
@PatrickDixon 然后你必须从你的函数中删除行empList = (TREE *)malloc(sizeof(TREE));
,因为你想直接对你给函数地址的结构进行操作,而不是对新分配的结构进行操作。
【参考方案2】:
您正在覆盖函数中 empList 的值,但它没有到达调用者。你真正需要做的是传入一个指向树指针的指针:
void initializeTree(TREE** empList)
*empList = (TREE *)malloc(sizeof(TREE));
[...]
您还可以找到更多信息(和其他选项)here。
【讨论】:
以上是关于如何在函数内正确分配结构? [复制]的主要内容,如果未能解决你的问题,请参考以下文章