如何为结构本身及其成员分配内存

Posted

技术标签:

【中文标题】如何为结构本身及其成员分配内存【英文标题】:how to allocate memory for struct itself, and its members 【发布时间】:2012-08-27 13:18:05 【问题描述】:

我有这个结构:

struct foo 
  char *a;
  char *b;
  char *c;
  char *d;
;

可以为结构本身及其成员分配空间,而不是例如,

struct foo f;
f.a = malloc();
f.b = malloc();
f.c = malloc();
f.d = malloc();
strcpy(f.a, "a");
strcpy(f.b, "b");
//..

类似这样的东西(当然它不起作用):

struct foo f = malloc(sizeof(struct f));
strpcy(f.a, "a");
//etc

【问题讨论】:

【参考方案1】:

如果这是您的要求,您当然可以一次性为结构本身及其成员分配内存。您只需要知道您将需要多少(总共)并处理任何可能的对齐问题(但在这种特殊情况下不存在)。

struct foo *f = malloc(sizeof *f + size_a + size_b + size_c + size_d);
f.a = (char*)(f + 1);
// ...

【讨论】:

【参考方案2】:

这称为构造函数。省略了错误处理,它可能看起来像:

struct foo *new_foo()

    struct foo *obj = malloc(sizeof(struct foo));
    obj->a = malloc(...);
    obj->b = malloc(...);
    obj->x = new_x(...);
    ...
    return obj;

并且需要相应的析构函数。如果你发现自己经常需要编写这样的代码,可能是时候改用 C++ 了:)。

【讨论】:

非常好。我已经忘记了。谢谢!但是关于这个实现的设计者,你如何检查非 NULL 值?谁应该检查它,构造函数还是调用者?在每个malloc()/calloc()调用之后检查返回值是否有非空值,但如果是NULL,那么释放之前分配的成员或调用者? C++ 为此使用异常 (bad_alloc) 和 RAII。内存分配失败是一种罕见的情况,而且通常无论如何都无法恢复。至于C代码,我可能会使用构造函数进行检查和free()s(或者可能是一两个退出:)。无论如何,这个函数的存在只是为了让调用者的生活更轻松;让他们承担错误恢复的负担将违背重点。 当然,调用者有责任对照NULL检查整体返回值,除非保证不会发生。【参考方案3】:

如果您在构建时知道所有“动态”变量大小,就可以做到。

struct foo *f = malloc(sizeof(struct f) + nSizeExtra);

f->a = (char*) (f + 1);
f->b = ((char*) (f + 1)) + nLengthOfA;
f->c = ((char*) (f + 1)) + nLengthOfA + nLengthOfB;
f->d = ((char*) (f + 1)) + nLengthOfA + nLengthOfB + nLengthOfC;

当然最后你应该只释放f(不是它的成员)

【讨论】:

【参考方案4】:

当然你可以为你的结构和它的成员分配内存,但是如果你为整个事情分配一个连续的内存,你无论如何都需要初始化你的结构的成员,所以你不能做你想做的事你愿意。

【讨论】:

为什么不呢?有什么我不知道的特殊原因吗? 好吧,我刚才写的不是很正确,但我认为它实际上回答了 Jack 的回答,他想调用 malloc 一次并使用结构和它的成员,因为它们已正确初始化。如果您按照其他人的建议进行操作,无论如何都需要先初始化成员。

以上是关于如何为结构本身及其成员分配内存的主要内容,如果未能解决你的问题,请参考以下文章

如何为静态变量分配内存?

如何为多维数组动态分配内存

Pybind11:如何为结构成员变量分配默认值?

如何为 Windows 中的进程分配超过 2GB 的内存?

我应该如何为我不知道大小的许多(1000+)数组分配内存?

如何为在 main() 外部和内部声明的变量分配内存