为结构内部的字段分配内存
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)
.
粗略地说,我有一个像这样的函数原型:
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)
.