2017-10-15 7 views
0

私は私のデータを格納するためのC言語で簡単なstruct作成:なぜ `struct`の代入でエラーになるのですか?

typedef struct 
{ 
    int n; 
    char *c[]; 
} simstr; 

をそして、この構造体変数への代入値のために、私はこのコードを使用:テストへ

simstr ex = 
{ 
    5, 

    "ex_11", 
    "ex_12", 
    "ex_13", 
    "ex_14", 
    "ex_15" 
}; 

変数が正しく作成されているかどうかは、私が作ったこの関数を実行します:

void funct(simstr a) 
{ 
    int i, 
     n = a.n; 

    for (i = 0; i < n; i++) 
    { 
     printf("%s\n", a.c[i]); 
    } 
} 

funct(ex); 

私はそれを正常にコンパイルします。残念ながら、それはΘ&の2行を返します。実行時エラーのためにこのプログラムは停止します。


私にあなたを教えてください:structの割り当てでエラーが発生するのはなぜですか?そしてそれらを解決する方法?

+0

あなたは私のためにそれを説明できますか:献金はありますか? – dn174822

+0

また、フレキシブルアレイメンバーの初期化は標準に準拠していません。集約初期化子は '{}'を必要とします。 GCCの拡張機能を使用しています。 –

答えて

2

他の構造のようにflexible array memberの構造体はコピーできません。

最も簡単な解決策は、関数の引数として構造体にポインタを使用して、コピーを一切行わないことです。ポインタを使用します。次に、構造が(不完全に)コピーされることはありません。

住所演算子&を使用して、構造体からポインタを作成します。

+0

そして関数内の ' - >'演算子。 –

+0

私はCにANSI標準を使用しています。私には何か提案はありますか? – dn174822

+0

@ dn174822はい。ポインタを使用する。フレキシブルな配列メンバはC99標準の一部です(私のリンクをたどって読んでも分かるはずですが)ので、20年後には "ANSI C"( "ANSI C"であれば*標準C *を意味します)に入っています。また、ポインターは、常にアドレス演算子を含むCプログラミングの自然な部分です。 –