2017-01-17 10 views
1

を構造化する整数をキャストしている私は、ポインタを構造化する整数をキャストすると、gccの上の警告(Linux)をスローするコードを持ってどのように有効な

typedef struct st { 
    int a; 
    char *b; 
}st; 
... 
int handle; 

int main() { 
... 
st *sptr = (st*)handle; 
... 
} 

C11仕様

アンによると、整数は任意のポインタ型に変換できます。前述の場合を除き、 の結果は実装定義であり、正しく整列されず、参照される型の エンティティを指していない可能性があり、トラップ表現である可能性があります。

私の質問は です。構造体のポインタに整数をキャストできますか、それとも他の方法を探して最後の手段として使うべきでしょうか?

+1

実際の警告メッセージを含めてください。おそらく警告は、intとポインタのサイズが異なることを示しています。これは重要です。 –

+0

ポインタは基本的に単なる整数であり、ポインタが指しているメモリのアドレスであることを覚えておいてください。キャストがやっているのは、 'handle'の値をとり、それをポインターのアドレスとして使用することです。固定メモリアドレスを持つ組み込みシステムでこのようなことをするのは珍しいことではありません。 –

+9

なぜこのようなキャストをしたいですか?あなたのプラットフォームでは、 'int'はポインタよりも小さい可能性があります。このようなものが絶対必要な場合は、 'int'の代わりに' intptr_t'を使います。 –

答えて

1

を検討するには、2つのものがあります。

  • 結果を表現することはできないかもしれません。 intは、指定されたプラットフォームのポインタ型と同じ表現ではない可能性があります。そのため、このような場合にはuintptr_tが存在します。 uintptr_t handle;はあなたのコードを移植可能にします。

  • 整数値は、指定されたシステムの整列アドレスと解釈できるものでなければなりません。

関連する問題