结构初始化不适用于malloc

时间:2014-08-28 05:37:12

标签: c pointers struct malloc

我在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。

任何提示?

2 个答案:

答案 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);