结构初始化不适用于malloc
我在C中有一个小背景,我正在努力挖掘,我遇到了一些我无法解释的事情。
假设我有以下结构:
struct World { Things* things; };
以及以下function:
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
函数中,第二种情况, initWorld
world->things
值在赋值为NULL后没有改变。 我还尝试将局部变量世界重命名为“w”,我认为可能调试器显示调用者的变量“world”,但是没有, w->things
仍未正确初始化为NULL。
任何提示?
在你的例子中, world
是指向World
的指针:它指向的东西可以改变,但指针本身不能改变。
您可以将指针传递给指向World
指针以解决此问题,但如果您在函数内部进行分配,我宁愿返回指针:
World *newWorld() { World *world = malloc(sizeof(*world)); if (world) world->things = NULL; return world; }
并像这样使用它:
World *world = newWorld();
指针与其他类型一样,它通过值作为函数参数传递。 您为函数中的(本地)参数world
分配了内存,但这不会影响被调用函数中的world
。 顺便说一下,这会导致内存泄漏。
而是使用指针指针:
void initWorld(World **world){ *world = malloc(sizeof(World)); (*world)->things = NULL; }
并称之为:
World *world; initWorld(&world);