2017-06-02 25 views
3

私は上記の警告行を削除する方法を見つけることができません。データはvoidポインタであり、コールバック関数の一部としてデータポインタに文字列を受け取ります。 voidポインタを型キャストしても、コンパイラはまだ警告を表示しています。逆参照 'void *'ポインタについて

以下の行には、基本的に2つの警告が表示されます。逆参照 1. '無効*' ポインタ型の式のアドレスを取っ 2.「無効C11を引用

service_ind = atoi((const char*)&data[at_response.param[0].start_of_value_index]) ? TRUE:FALSE ; 

以下に必要とされる情報

void * data; 
AT_PARSER_RESPONSE at_response; 

typedef struct 
{ 

/*Other parameters */ 

AT_PARAM param[AT_MAX_NUM_PARAM]; 

}AT_PARSER_RESPONSE 
+1

'at_response.param [0]'の型が何であれ、 'data'、' at_response'の定義を示してください。 – aschepler

+0

私はまだコーヒーの最初のカップですが、優先順位は '(const char *)&data [at_response.param [0] .start_of_value_index]'(余分な括弧が必要な場合があります)または 'data'が本当に何であるかに依存して、' [] 'を使う前に 'data'を有効な型にキャストする必要があるということです。 – crashmstr

答えて

5

、章§6.5.3.2

単項式*演算子は間接を示します。オペランドが関数を指している場合、結果は関数指定子 になります。オブジェクトを指す場合、結果は オブジェクトを指定する左辺値になります。オペランドに型 ''ポインタ型 ''がある場合、結果の型は ''型 ''です。 無効な値がポインタに割り当てられている場合、単一*演算子の動作は、 未定義です。

したがって、コードではundefined behaviorが発生します。章から、関連また

、§6.2.5

voidタイプ値の空のセットを含みます。 が完了できない不完全オブジェクトタイプです。

ので、voidへのポインタを間接参照のため無効オペランドです。


一つの可能​​性の高い実用的な場合と可能な解決策

は時々、私たちはキャスト関数の内部では、ジェネリック医薬品を作るために、我々は、void *に一定のポインタをキャスト関数に引数としてそれを渡し、既知の情報に基づいて元のタイプに戻ります。これは、6.3.2.3章の通り、完全に有効なケースです。

[...] へのポインタ任意のオブジェクト型はvoidへのポインタに変換され、再び戻されます。結果は と元のポインタを比較します。

これはあなたのケースで、あなたが関数内で参照解除している場合、あなたはそれが元の型(または互換性のあるタイプ)です

逆参照の前。

+0

あなたが引用しているリンクを追加してください。 – CIsForCookies

+1

@CIsForCookies私が言及したように、それはC11標準からのもので、実際のものは販売されていますが、かなり正確ないくつかのドラフトバージョンをオンラインで入手できます。 :) –

+1

*逆参照の前にポインタを有効な型にキャストすることもできます。[厳密なエイリアシングに違反する可能性があるため、未定義の動作も可能です(https://stackoverflow.com/questions/98650/what-is)。例えば ​​'char *'で始まり、 'void *'に代入してから 'double *'にキャストして逆参照しようとすると、 –

関連する問題