如何为结构本身及其成员分配内存
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 一次并使用结构和它的成员,因为它们已正确初始化。如果您按照其他人的建议进行操作,无论如何都需要先初始化成员。以上是关于如何为结构本身及其成员分配内存的主要内容,如果未能解决你的问题,请参考以下文章