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

もちろん、構造体とそのメンバーにメモリを割り当てることはできますが、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 に答える