0

我有这个结构:

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
4

4 回答 4

4

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

struct foo *f = malloc(sizeof *f + size_a + size_b + size_c + size_d);
f.a = (char*)(f + 1);
// ...
于 2012-09-02T15:19:22.250 回答
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(不是它的成员)

于 2012-09-02T15:18:08.320 回答
1

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

于 2012-09-02T15:19:14.200 回答
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++ 了 :)。

于 2012-09-02T15:31:47.337 回答