【问题标题】:Array inside struct filled with garbage after initialization初始化后结构内的数组充满垃圾
【发布时间】:2014-06-20 11:59:32
【问题描述】:

我定义了一个数据结构 (Foo),其中包含指向自身的 25 个指针 (members) 的数组。我想将这些指针中的每一个初始化为NULL,但我的 init 函数无法正常工作。当我的Foo ffoo_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 充满了随机垃圾值。

【问题讨论】:

  • 你的编译器不抱怨你的代码吗?
  • @ThomasPadron-McCarthy:我想应该...
  • 这是一个错字,对不起。修好了。
  • 为什么malloc 进入你的类对象?
  • 您正在为foo_init 的第一行中已在堆栈上声明的内容分配堆内存。摆脱那条线。

标签: c arrays pointers initialization


【解决方案1】:

main 中的Foo 地址会立即被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;
}

或者简单地 return 一个指针,因为它在 C 中是惯用的:

Foo *foo_init(void);

【讨论】:

  • 编译器是否知道 *f 在 sizeof 时刻的类型?谢谢我今天学到了一些东西:)
  • 你能告诉我你为什么使用指向指针Foo **out_f的指针吗?
【解决方案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 是对的

【讨论】:

  • 哎呀,这只是一个错字。我的实际代码已经看起来像 Foo f ; foo_init(&amp;f) ;
  • 这是行不通的,因为该函数所做的第一件事就是丢弃传入的值并 malloc 一个新结构。
【解决方案3】:

如果你想在 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;
}

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多