C 関数から柔軟な配列メンバーを持つ構造体を返す必要がありますが、コンパイルできない理由がわかりません。次のように配列を構造体にカプセル化することで、配列を返すことができることを私は知っています。
struct data_array {
long length;
double data[];
};
私の関数は次のようになります。
struct data_array test (int length) {
struct data_array a;
double* b = malloc (1000);
a.length = 1000;
a.data = b;
return a;
}
ただし、コンパイラは「柔軟な配列メンバーの無効な使用」を返します。
本「21st Century C」によると、構造体のデータ配列はポインターとして扱われます (これは私には完全に理にかなっています)。初期化されていないため、データを保持するためのメモリが割り当てられていないはずです。(コンパイラでさえ、必要なメモリ量を知りません)。したがって、メモリを割り当てて、それを戻り変数に割り当てる必要があります。
では、なぜコンパイラはエラーを返すのでしょうか? そして、どうすればこの問題を解決できますか?