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

我有这个结构:

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

它可能为struct本身及其成员分配空间而不是例如,

 struct foo f; fa = malloc(); fb = malloc(); fc = malloc(); fd = malloc(); strcpy(fa, "a"); strcpy(fb, "b"); //.. 

像这样的东西(它不起作用):

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

这称为构造函数。 省略error handling,它可能看起来像:

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

并需要一个相应的析构函数。 如果你发现自己需要经常编写这样的代码,那么可能是时候切换到C ++ :)了。

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

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

如果您在施工时知道所有“动态”变量尺寸,则可以执行此操作。

 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 (不是其成员)

当然你可以为你的struct和它的成员分配内存,但是如果你为整个事件分配一个连续的内存,你将需要初始化你的struct的成员,所以你不能像你想的那样轻松地做你想要的喜欢。