结构初始化不适用于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);