ある構造体が別の構造体の中にある構造体をどのようにmallocしますか?
また、構造体内のアイテムの配列をmallocし、必要に応じてこの配列を再割り当てしたいのですが、これはどのように正しく行われますか?
構造体を宣言し、次に上記を宣言する例を教えてください。
物事の順序が少しわかりません。
構造体内の配列を解放してから、構造体自体を解放しますか?構造体を作成するときに構造体をマロックし、次にそのフィールドをマロック/宣言する必要がありますか?
typedef struct _A
{
int *arr;
int arrCount;
} A;
void Construct_A(A *a, int arraySize)
{
a->arrCount = arraySize;
a->arr = (int*)malloc(sizeof(int)*arraySize);
}
void Destruct_A(A *a)
{
free(a->arr);
a->arr = 0;
}
typedef struct _B
{
A *a;
} B;
void Construct_B(B *b, int arraySize_A)
{
b->a = (A*)malloc(sizeof(A));
Construct_A(b->a);
}
void Destruct_B(B *b)
{
Destruct_A(b->a);
free(b->a);
b->a = 0;
}
void main()
{
B b;
Construct_B(&b, 10);
// Use b and b->a
Destruct_B(&b);
}
あまり読みやすくはありませんが、countメンバーと最後の単一要素配列メンバーを使用して構造を作成する場合があります。次に、配列内の要素をカウントするために書き込むことができるように十分なスペースを割り当てる特別なファクトリメソッドがあります。明らかに、配列メンバーは任意のタイプにすることができます。
typedef struct {
int count;
int elements[1];
} int_array;
int_array* allocate_int_array(int count)
{
int_array* mem = (int_array*)malloc(sizeof(int_array) + (count - 1) * sizeof(int));
if (mem)
mem->count = count;
return mem;
}