Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 初始化后,结构中的数组被垃圾填充_C_Arrays_Pointers_Initialization - Fatal编程技术网

C 初始化后,结构中的数组被垃圾填充

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

我定义了一个数据结构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(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;
}