data不完全な配列 (指定された次元のない配列) であると宣言するか、ポインターであると宣言することができます。(構造体内の不完全な配列は最後のメンバーである必要があり、柔軟な配列メンバーと呼ばれます。)
不完全な配列であると宣言すると、構造体には基本的にlength要素と、割り当てた数の配列要素が含まれます。次のように、構造体の基本サイズにすべての要素のスペースを加えたものを割り当てる必要があります。
struct data_array *b = malloc(sizeof *b + NumberOfElements * sizeof *b->data);
ただし、柔軟な配列の余分な要素を返す方法がないため、この方法で割り当てられた構造体を返すべきではありません。関数の戻り値の型には、構造体の基本サイズのみが含まれます。ただし、構造体へのポインタを返すことはできます。したがって、戻ることはできますが、戻ることはできbません*b。
ポインターであると宣言する場合は、構造体を作成し、次のようにポイントするdataためのスペースを個別に割り当てます。data
struct data_array b;
b.length = NumberOfElements;
b.data = malloc(NumberOfElements * sizeof *b.data);
コードサンプルを次に示します。まず、柔軟な配列メンバーを使用します。
struct data_array
{
long length;
double data[];
};
struct data_array *test(size_t NumberOfElements)
{
struct data_array *b = malloc(sizeof *b + NumberOfElements * sizeof *b->data);
// Put code here to test the result of malloc.
b->length = NumberOfElements;
return b;
}
またはポインタを使用して:
struct data_array
{
long length;
double *data;
};
struct data_array test(size_t NumberOfElements)
{
struct data_array b = { NumberOfElements,
malloc(sizeof *b + NumberOfElements * sizeof *b->data) };
// Put code here to test the result of malloc.
return b;
}