我定义了一个数据结构(Foo
),其中包含一个25个指针(members
)的数组。我想初始化每个指向NULL
的指针,但我的init函数无法正常工作。当我的Foo f
从foo_init()
返回时,只有部分members
为NULL
,其他人只会填充随机值。
//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
充满了随机垃圾值。
答案 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;
}