C 初始化后,结构中的数组被垃圾填充
我定义了一个数据结构Foo,其中包含25个指向自身的指针成员数组。我想将这些指针初始化为NULL,但我的init函数不能正常工作。当我的Foo f从Foo_init返回时,只有一些成员为NULL,其他成员只是用随机值填充C 初始化后,结构中的数组被垃圾填充,c,arrays,pointers,initialization,C,Arrays,Pointers,Initialization,我定义了一个数据结构Foo,其中包含25个指向自身的指针成员数组。我想将这些指针初始化为NULL,但我的init函数不能正常工作。当我的Foo f从Foo_init返回时,只有一些成员为NULL,其他成员只是用随机值填充 //in Foo.h #include <stdio.h> #include <stdlib.h> typedef struct Foo { struct Foo * members[25] ; } Foo ; void foo_init(F
//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内部,所有成员都为NULL。但是从foo_init返回后,f.members充满了随机垃圾值。那么试试这个
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是正确的调用malloc会立即覆盖main中的Foo地址。只需删除该行,您的初始化就可以了
如果您确实希望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;
}
另一个选项是,如果要在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;
}
你的编译器没有抱怨你的代码吗?@ThomasPadron McCarthy:我想应该是……这是个打字错误,对不起。修复了它。为什么要将malloc放入类对象中?您正在为在foo_init的第一行中已在堆栈上声明的内容分配堆内存。把那句台词删掉。哎呀,那只是个打字错误。我的实际代码已经看起来像foof;富奥国际酒店;这是行不通的,因为函数做的第一件事就是扔掉传入的值并malloc一个新的结构。编译器知道在sizeof时刻*f的类型吗?Thx我今天学到了一些东西:你能告诉我为什么你要使用指向Foo**out\f的指针吗?
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;
}