malloc用于结构域内的字段

时间:2017-07-05 23:45:24

标签: c dynamic-memory-allocation

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

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

其中superstruct看起来像

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

该功能应该

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

2)...分配超级内存的名称字段以保存名称参数,并且......

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

我的问题:以下代码是否会实现这些目标?

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

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

1 个答案:

答案 0 :(得分:4)

首先:

*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参数分配数组{{1} },而不是calloc()