为结构内部的字段分配内存

malloc'ing for field inside struct

粗略地说,我有一个像这样的函数原型:

init_superstruct(const char *name, Superstruct **super, int num_substructs) {...

上层结构看起来像

typedef struct superstruct {
    char *name, 
    Substruct **substructs, 
    int num_substructs;
} Superstruct

该函数应该

1) 为 super 分配内存(并初始化),通过...

2) ...分配足够内存的名称字段来保存名称参数,并且...

3) ...为 substructs 字段分配足够的内存来保存指向 Substructs(大小 num_substructs)的数组指针。

我的问题:下面的代码能实现这些目标吗?

*super = malloc(sizeof(*super));
*super->name = malloc(sizeof(strlen(name) + 1)));
*super->substructs = calloc(num_substructs, sizeof(Substruct));

这实际上是我第一次涉足动态内存分配。您的任何建议都会对我有所帮助!

第一个:

*super = malloc(sizeof(*super));

你想要sizeof(**super)*super 是一个指针,类型为 Superstruct *,因此不会分配足够的内存。

真的,你可能应该正常分配结构,然后将它单独分配给指针。这将使您的代码更容易编写:

Superstruct *r = malloc(sizeof *r);
r->name = …
*super = r;

第二个:

*super->name = malloc(sizeof(strlen(name) + 1)));

这是错误的。 sizeof(strlen(name) + 1)sizeof(int)(或者可能是 sizeof(size_t);无论哪种方式都不是您想要的)- strlen() 甚至不会被调用!从此表达式中删除 sizeof() 以使其正确。


第三:要分配单个 Substruct 对象数组,将结构成员定义为 Substruct *substructs,并使用您现在获得的确切代码对其进行分配。你不需要双指针,除非你想要一个指向结构的 指针数组 ,这比你需要的更复杂。

如果您真的认为此处确实需要一个指针数组(您可能不需要),则需要使用 sizeof(Substruct *) 作为 size 参数分配数组 calloc(), 而不是 sizeof(Substruct).