粗略地说,我有一个像这样的函数原型:
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));
这实际上是我第一次涉足动态内存分配。你有任何建议对我有帮助!
答案 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()
。