我在C中有一个小背景,我正在努力挖掘,我遇到了一些我无法解释的事情。
假设我有以下结构:
struct World {
Things* things;
};
以及以下功能:
void initWorld(World *world);
void addThingToWorld(World *world, Thing *thing);
现在,根据initWorld
的实现以及我如何使用它,它将工作与否。但我不明白为什么第二次实施会失败。两种实现都在下面:
void initWorld(World *world){
world->things = NULL;
}
// usage
World world;
initWorld(&world);
// will work, because world has been correctly initialized.
addThingToWorld(&world, &something);
void initWorld(World *world){
world = (World*) malloc(sizeof(World));
world->things = NULL; // here it does not work! things is not changed to 0x0 :(
}
// usage
World *world;
initWorld(world);
// this will crash as a side-effect of the failed world initialization (world->things has not been correctly set to NULL)
addThingToWorld(world, &something);
感谢您的帮助,并纠正我可能正在做的任何废话,目前我的C背景非常糟糕:)
好的,我理解我在第二种情况下传递指向我的函数的指针,并使用本地malloc重新赋值,所以最后调用者的变量没有改变。然而,当我调试时,仍然有一些我不理解的东西。在initWorld
函数中,第二种情况,world->things
值在分配为NULL后没有更改。 我还尝试将局部变量世界重命名为“w”,我想也许调试器显示调用者的变量“world”,但是没有,w->things
仍未正确初始化为NULL。
任何提示?
答案 0 :(得分:1)
在您的示例中,world
是指向World
的指针:它指向的内容可以更改,但指针本身不能更改。
您可以将指针传递给指向World
的指针以解决此问题,但如果您在函数内部进行分配,我更愿意返回指针:
World *newWorld()
{
World *world = malloc(sizeof(*world));
if (world) world->things = NULL;
return world;
}
并像这样使用它:
World *world = newWorld();
答案 1 :(得分:1)
指针与其他类型一样,它通过值作为函数参数传递。您为函数中的(本地)参数world
分配了内存,但这不会影响被调用函数中的world
。顺便说一下,这会导致内存泄漏。
而是使用指向指针的指针:
void initWorld(World **world){
*world = malloc(sizeof(World));
(*world)->things = NULL;
}
并称之为:
World *world;
initWorld(&world);