2011-11-13 11 views
2

main.hCで構造体の配列を定義していますか?

#define DATA struct data 
DATA 
{ 
    int id; 
    char data; 
} 

main.cの

DATA *listOfData[100]; 

ので、この時点で私は/このようなリスト内のデータにアクセスできるようにする必要があります。

printf(listOfData[5]->data); 

それはにISN私にそれをさせてもらうと、その最後の印刷物fの上で動かされるだけです...エラーも何もありません。

+4

はの#defineの後ろにキーワードを非表示にしないでください。あなたは自分を混乱させる。 – wildplasser

+0

定義は私の教授が私に与えたフレームワーク/擬似コードの一部です –

+7

まあ、それをやめさせるように教えてください! – wildplasser

答えて

2

これは、ポインタの配列を定義したためです。しかし、ポインタのいずれも初期化したことはありません。したがって

:あなたは、インデックス5

*で(無効)のポインタを参照解除されている(そして、それは、構造体を定義するための非常に奇妙な方法だから

printf(listOfData[5]->data); 

は、(未定義の動作)クラッシュします。.. )

この問題を解決するには、配列内の各ポインタに割り当てる必要があります。

DATA listOfData[100]; 

とアクセスそれのように:

listOfData[5].data 

次に、あなたが実際にポインタの配列であることをそれを必要としないなら、それ、構造体自体の配列にする方がよいかもしれません各要素の割り当てに対処する必要はありません。

0

DATA *のメモリ割り当ては表示されていません。どちらかのように、構造体のデータの配列としてあなたの配列を宣言:

DATA listOfData[100]; 

または動的にメモリを割り当て、あなたの配列にポインタを割り当てます。

1

私はなぜprintfがフリーズするのか分かりませんが、これにはいくつか問題があります。まず、DATA*配列内のすべてのポインタが初期化されていません。おそらく、代わりにDATAポインタの配列を、DATAの配列を作るためのもの:

DATA listOfData[100]; 

ます。また、セミコロンを持つ構造体を終了していなかったので、これもコンパイルとは考えにくいようだ:

#define DATA struct data 
DATA 
{ 
    int id; 
    char data; 
}; 

最後に、安全性の低い方法でprintfを使用しています。最初の引数はフォーマット文字列にする必要がある、または最初の引数はそれで%を持っている場合、あなたは奇妙な振る舞いを得ることができます。

printf("%c\n", listOfData[5].data); 
関連する問題