c - 结构体内部字段的 malloc

标签 c dynamic-memory-allocation

粗略地说,我有一个像这样的函数原型(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/

相关文章:

C sha1 实现不适用于 Unix

c - C编译器在递归过程中如何处理堆栈中的局部变量?

C++ new 运算符分配新内存

c - 在 C 中使用动态分配将文件读入多维数组

c - sprintf 和分配内存

c - 如何在C中找到所有可能的选项?

c - 如何在 C 中将 double 组转换为整数数组?

c++ - 异常处理是否需要面向对象的编程?

c++ - C++ 中的全局动态 Allcoated 变量

c++ - 多维动态内存 vector c++