2011-10-19 39 views
2

私はCに新しいですし、コードの関連部分があるwarning.The私は初期互換性のないponiterタイプを取得していますなぜ私は、それを把握することはできません。コンパイラの警告:初期化、互換性のないポインタ型

struct a { 
    int address; 
    B * apples[8]; 
} A; 

struct b { 
    int color; 
} B; 

私はa_listと呼ばれる配列を持っています。私は現在やっていることは次のとおりです。

B *b_list = a_list[i].apples; // i being an index in for loop 
b_list[6].color = 0; 

以上が正常に動作しますが、警告スロー:私の推論は、私は

B ** b_list = a_list[i].apples; // as it is pointer to pointer. 
So now b_list basically points to a pointer which points to an array of 6, yea? 
So: (*b_list)[6].color   // However this causes segmentation fault. 
をやるべきということである、それを修正するために

Initialization from incompatible pointer type. 

構造体AがB *りんご[8]ではなく、Bりんご[8]を持っていたときも正しく動作していました。ただし、このソリューションを使用しても、作成された場所以外の機能の変更は維持されません。

アドバイスをしてください。

答えて

0

構造体AがBりんご[8]、 ではなくB *りんご[8]を持っていたときも正しく動作していました。しかし、この解決方法を使用しても、 以外の機能の変更は維持されません。

オブジェクトへのポインタをそのような関数に渡すと、変更はそれらの関数の外側で持続します。なぜなら、あなたは値でオブジェクトを渡していたからです。

1

AおよびBはタイプではなく、struct aおよびstruct bのインスタンスです。おそらく、あなたは、古典的なCのイディオムを使用したいが、あなたはtypedef不足している:

typedef struct a { 
    ... 
} A; 

struct aAは同じものです。

最後のコードスニペットでは、(*b_list)[6].colorは実際には(*b_list[6]).color以上、さらにはb_list[6]->colorである必要があります。

+0

上記の両方がセグメンテーション違反を引き起こします。それはいくつかのブロックが割り当てられていないからですか? – Catie

+0

@Catie:配列に 'B'をそれぞれ割り当てましたか? –

関連する問題