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

时间:2012-09-02 15:13:13

标签: c struct dynamic-allocation

我有这个结构:

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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(不是其成员)

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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