4

別の構造体内の構造体の配列にシーケンシャル メモリを割り当てる方法を知りたいです。struct2 の配列を持つ struct1 があるとします。すべてを 1 つの連続したメモリ ブロックに格納したいと考えています。

malloc を使用してブロックを割り当てることはできますが、配列のメモリを割り当てるにはどうすればよいでしょうか?

struct1 *set = malloc(sizeof(struct1) + sizeof(struct2)*number_of_structs);
set->arr = (struct2*)set + sizeof(struct); //This is probably wrong
set->arr[0].data = 1;
set->arr[1].data = 2; 
...

ありがとうございました。

4

2 に答える 2

3

柔軟な配列メンバーを使用します:

#define NUM_ELEM  42

struct a {
   /* whatever */    
};

struct b {
    int c;
    struct a d[];  // flexible array member
};

struct b *x = malloc(sizeof *x + NUM_ELEM * sizeof x->d[0]);
于 2012-10-09T18:54:09.827 に答える
2

この方法は一部の Windows API で使用され、次のようになります。

struct struct1
{
     // some members ...

     struct struct2 arr[1];
}

struct1 *set = malloc(sizeof(struct1) + sizeof(struct2) * (number_of_structs-1));

number_of_structsset->arr はメンバーの配列を指します。struct1 には常に、内部に少なくとも 1 つの struct2 + 連続したメモリ ブロック内の他の struct2 メンバーが含まれます。

于 2012-10-09T18:56:12.447 に答える