2016-11-22 8 views
0

構造体の配列をC言語で設定しようとしています。実行時まで配列のサイズがわからないため、配列を動的に定義しようとしました。私は以下のコードに自分の問題を減らしました(それぞれの構造体にはいくつかのメンバーがありますが、問題はありません)。struct内の構造体の配列

//struct definitions 
struct intStream { 
int test; 
}; 

struct io { 
struct inStream **inputStream; 
}; 

// then proceed to main 
int numDevices = 4; //(derived from number of devices found at runtime) 
struct io *devices; 
devices->inputStream = malloc(sizeof(struct inStream) * numDevices) 

// Fails on 
devices->inputStream[0]->test = 1; 

メモリの私の理解が完全ではありませんが、いくつかの検索を通じて、私は審美的に私は構造体ハック以外に私の問題への代替解決策を見つけることができませんでしたので、私は、まだCスタイルのプログラミングに比較的新しいです好きではないだけでなく、将来的にはより多くの配列を含めることを望んでいます。

+1

。あなたはそれが何を指していると思いますか? –

+2

質問に答えを加えないでください、ありがとう。 :) –

+0

@ n.m。私は自分の道の誤りを見せている; – Rampartisan

答えて

3

このコードでは、devicesは初期化されていません。初期化されていないメモリを使用すると、undefined behaviorが呼び出されます。

devicesは、そのポインタを省略する前に、有効なメモリをポイントする必要があります。言っ

devices->inputStream = malloc(sizeof(struct inStream) * numDevices) 

も間違って見えます。あなたが望むかもしれないのは、

devices->inputStream = malloc(sizeof(struct inStream *) * numDevices); 

です。そして、それぞれdevices->inputStream[i]にもメモリを割り当てる必要があります。


[OPによって変更されたコード、質問から除去し、ちょうど参考のために、答えに追加]あなたはunitialised変数 `devices`を持って

struct io *devices; 
devices = malloc(sizeof(*devices)); 

devices->inputStream = malloc(sizeof(struct inStream *) * numDevices); 

for(int i = 0; i < 4; i++) { 
    devices->inputStream[i] = malloc(sizeof(struct inStream)); 
} 
+0

ソリューションをありがとう、あなたが説明した方法で完璧な意味を作る。私はこのコメントに完全な形の回答を入れようとしましたが、それは仕事をしなかったので、私はあなたのアドバイス/解決策で質問を更新しました。 – Rampartisan

+0

@ user2142136私は自分自身でコードを修正して追加しましたが、これは問題ありません。 :) –