初始化后,struct里面的数组充满了垃圾

时间:2014-06-20 11:59:33

标签: c arrays pointers initialization

我定义了一个数据结构(Foo),其中包含一个25个指针(members)的数组。我想初始化每个指向NULL的指针,但我的init函数无法正常工作。当我的Foo ffoo_init()返回时,只有部分membersNULL,其他人只会填充随机值。

//in Foo.h
#include <stdio.h>
#include <stdlib.h>

typedef struct Foo {
    struct Foo * members[25] ;
} Foo ;

void foo_init(Foo * f) ;

//in Foo.c
void foo_init(Foo * f) {
    f = (Foo*)malloc(sizeof(Foo));

    for (size_t i = 0 ; i < 25 ; i++) {
        f->members[i] = NULL ;
    }
    /* Ok here, all members are NULL */
}

//in main.c
#include "Foo.h"

int main(int argc, const char * argv[])
{

    Foo f ;
    foo_init(&f) ;

    /* why isn't every index of f.members NULL? */


    /* ... */
    return 0;
}

我通过LLDB运行了我的代码。在foo_init()中,所有members都是NULL。但是从foo_init()返回后,f.members充满了随机垃圾值。

3 个答案:

答案 0 :(得分:5)

Foo的{​​{1}}地址被main的电话立即覆盖。只需删除该行,您的初始化即可。

如果您真的希望malloc分配内存,可以将其转换为:

foo_init

或简单地void foo_init(Foo **out_f) { Foo *f = malloc(sizeof *f); for (size_t i = 0 ; i < 25 ; i++) { f->members[i] = NULL; } *out_f = f; } 指针,因为它在C:

中是惯用的
return

答案 1 :(得分:2)

试试这个

Foo *f ;
foo_init(&f) ;


void foo_init(Foo ** f) {
    *f = (Foo*)malloc(sizeof(Foo));

    for (size_t i = 0 ; i < 25 ; i++) {
        (*f)->members[i] = NULL ;
    }
}

@TripeHound是对的

答案 2 :(得分:1)

另一种选择是如果要在foo_init()中分配Foo,则使用指向指针的指针。这样f从foo_init返回后指向有效内存

void foo_init(Foo ** f) {
    *f = (Foo*)malloc(sizeof(Foo));

    for (size_t i = 0 ; i < 25 ; i++) {
        (*f)->members[i] = NULL ;
    }
}

int main()
{
    Foo *f;

    foo_init(&f);

    return 0;
}