在其他函数中设置struct成员的值

时间:2013-03-07 07:46:41

标签: c++ memory malloc allocation

假设我有这个结构:

    typedef struct Foo {
        int a;
        int b;
        int c;
    } Foo;

现在,我创建了这个初始化函数,它将为Foo分配内存,并将值预设到我的对象中,如下所示:

    void initializeFoo(Foo *foo) {
        foo = (Foo*)malloc(sizeof(Foo));
        foo->a=0;
        foo->b=15;
        foo->c=0;
    }

在Foo之上,假设我们创建了一个名为Display的C ++类,因此我们可以在屏幕上显示Foo。

     class Display {
          public:
              Display();

          private:
              Foo* foo;
     }

在Display构造函数内部,我使用initializeFoo(foo)来初始化foo的值,但是我为foo设置的预设值不存在。

我认为这可能是内存分配问题。我确保Display正确地分配了C ++的'new'。但是,我一整天都在摸不着头脑。

似乎它无法工作的唯一原因是因为我在initializeFoo()中设置了这些值。但是,这对我来说没有意义。

其他人对这里可能发生的事情有更好的看法吗?

3 个答案:

答案 0 :(得分:3)

你可能意味着

void initializeFoo(Foo **foo) {
        *foo = (Foo*)malloc(sizeof(Foo));
        (*foo)->a=0;
        (*foo)->b=15;
        (*foo)->c=0;
    }

答案 1 :(得分:2)

您将Foo指针按值传递给initializeFoo,因此无法修改调用者的指针。如果你想要这种初始化器,你需要将指针传递给指针:

void initializeFoo(Foo **foo) {
    *foo = malloc(sizeof(Foo));
    (*foo)->a=0;
    (*foo)->b=15;
    (*foo)->c=0;
}

但是,在这种情况下,如果您只是简单地返回Foo*,则会更容易:

Foo *initializeFoo() {
    Foo* foo = malloc(sizeof(Foo));
    foo->a=0;
    foo->b=15;
    foo->c=0;
    return foo;
}

答案 2 :(得分:2)

偶数指针按值传递与所有out参数一样,它们必须通过地址(&var)或C ++传递,参数可以是引用类型(在本例中是引用 - 指针类型)。后者可能更好,更不用说最小的改变了:

改变这个:

void initializeFoo(Foo *foo) 

对此:

void initializeFoo(Foo*& foo) // <== note reference-to-pointer

话虽这么说,但在一个很好的C ++程序中没有地方可以实现定义良好的RAII方法。阅读this brief document,了解您不应该首先使用指针来拥有资源。最终,您的foo成员应该是智能指针,如果不是直接的对象实例。