2017-11-25 25 views
1

構造体の一部として可変長の2次元配列ポインタを含めることをお勧めしますが、c99コンパイラはArray anArray行で次のようなエラーを表示します。空の構造体 "です。2次元配列型を含むC構造体定義

typedef const int Array[][2]; 

typedef struct { 
    Array anArray; 
} StructType; 

Array myArray = {{1,2},{3,4},{5,6}}; 

StructType myStruct = { myArray }; 

この問題と解決方法については、わかりやすくありがとうございます。私は最終的に他のコンポーネントをStructTypeに追加します。

+0

私はあなたがしたいことをかなり得ていません。 – coderredoc

+1

フレキシブル配列は、複数の名前付きメンバを持つ 'struct'の最後のメンバとしてのみ使用できます。唯一のメンバがフレキシブルな配列である 'struct'を持つことはできません。これを修正した後、私はあなたがやっているように柔軟な配列を初期化できるとは思わない。 – AlexP

+2

配列ポインタではありません。それは配列です。このようなFAMの定義は、構造体の割り当てが配列をコピーしないので、とにかくまったく役に立たないでしょう。したがって、memcpyを使用する必要があります。そして、その配列に何個の要素*があるのか何もない。 –

答えて

2

構造体は配列のサイズを知る必要があります。ここでは次元が1つ欠けています。宣言と初期化が同時に行われた場合、あなたは

int Array[][2] = {{1,2},{3,4},{5,6}}; 

を例えば可能性があり、コンパイラは配列のためのスペースを作り、(そうでなければそれは動的割り当てを使用して、実行時でなければならないであろう)の値を設定します。

第二に、Cで残念ながら、アレイを初期化するの実用的な方法が

実行時に行われなければならない(及びCは、いくつかのトラブルの場合には割り当てのようなものを実行しなければならない
StructType myStruct = { myArray }; 

ことは不可能ですオブジェクトのサイズを最新の状態に保つメカニズムがないため)あなたは何ができるか

が、しかし、行方不明の次元のサイズを設定し、そして配列をコピーされたメモリ機能のおかげでmemcpy

typedef const int Array[3][2]; 

typedef struct { 
    Array anArray; 
} StructType; 

int main(int argc, char **argv) { 

    Array myArray = {{1,2},{3,4},{5,6}}; 

    StructType myStruct; 
    memcpy(myStruct.anArray,myArray,sizeof(myArray)); 

また、このよう

構造体の宣言と初期化を行うことができます
StructType myStruct = { {{1,2},{3,4},{5,6}} }; 

とC99で、ためにも

StructType myStruct = { .anArray = {{1,2},{3,4},{5,6}} }; 
0

感謝コメント。コードを次のように変更し、コンパイルしました。

typedef const int Array[][2]; 

typedef const struct { 
    int something; 
    Array *pAnArray; 
} StructType; 

Array myArray = {{1,2},{3,4},{5,6}}; 

StructType myStruct = { 0, &myArray }; 
0

わからなくても、柔軟な配列メンバーで構造体を作成することができます。通常、Cでは、構造体と共用体のすべてのメンバーが完全な型を持つ必要があります。つまり、コンパイル時にその長さを正確に知る必要があります。ただし、最後のメンバーは例外ではなく、"flexible array member"になる必要はありません。あなたの場合の問題は、構造体に他のメンバーがいないということです。これは合法ではありません(なぜこれがatmであるのか説得力のある根拠はありません)。構造体にポインタを格納することはもちろん、完全な配列を格納することとは同じではありませんが、少なくとも初心者の方が望ましいでしょう。

関連する問題