粗略地说,我有一个像这样的函数原型(prototype):
init_superstruct(const char *name, Superstruct **super, int num_substructs) {...
super 结构看起来像
typedef struct superstruct {
char *name,
Substruct **substructs,
int num_substructs;
} Superstruct
该函数应该是
1) 为 super 分配内存(并初始化),通过...
2) ...分配足够内存的名称字段来保存名称参数,并且...
3) ...为子结构字段分配足够的内存来保存指向子结构的数组指针(大小为 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)
.
关于c - 结构体内部字段的 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44937645/