2011-06-20 9 views
1

取得、これは労働組合のcharへのポインタの正しい構文である場合、私はちょうど思っていた:は、組合内の変数へのポインタ

union myunion { 
char character[4]; 
} 

... = &(myunion.character[0]) 

私のアプリケーションでは、正しい結果を生成するようで、私はインターネット上で正しい構文を見つけることができないようです。

ありがとうございました。

+1

「正しい結果が得られないようですか?また、結果と期待される結果とは何ですか?それはコンパイルされますか?それはあなたがポインターから得るものがあなたが期待したものではないのですか? – zneak

+0

私は「正しい結果を生むようです」という意味です。予想外のことをしていないことを確認したいだけです。 – JonaGik

+0

申し訳ありませんが、質問を誤解しました。 myunionは宣言された変数ではないので、上記はコンパイルされません。代わりに、union myunion unのようなunion myunionの実際のインスタンスが必要です。 void * ptr =(void *)(&(un.character [0])); – Chris

答えて

5

正しい構文です。しかし、あなたが知っておく必要がある1つの問題があります:x86プロセッサーはlittle-endianです。これはつまり、あなたは、x86プラットフォーム上で展開(これはちょっとありそうである)、または任意の他のリトルエンディアンのプラットフォーム、および整数を持っている場合は、そのようなこと:次に

int value = 0x01020304; 

、次のように読みますあなたのchar配列:

character[0] == 04; 
character[1] == 03; 
character[2] == 02; 
character[3] == 01; 

つまり、バイトはメモリから逆の順序で読み込まれます。エンディアンが異なるアーキテクチャー間でアプリケーションを移植可能にする必要がある場合、これはすぐに醜くなります。

ただし、これを考慮している場合や、エンディアンが異なるアーキテクチャをサポートする予定がない場合は、問題ありません。

+0

答えとヘッドアップの両方に感謝します! – JonaGik

0
union myunion 
{ char ch[4]; }; 
... 
union myunion u; 
void *ptr = (void*)&u; 

このコードはptrに組合変数uのアドレスが配置されます。

関連する問題