2012-02-21 12 views
1

の文字へのポインタ私は、次のコードのロジックが含まれているレガシーコードを持っている:型キャスト符号なしロングロングC

unsigned long long address; /* Its content = Some Address, not a normal value */ 

strcmp (address, (const char*)some_char_buffer); 

これはGCCとの警告を与えます。

誰かがcharポインタに変数 'アドレス'を型キャストする方法を提案することができます。これにより、正しくデコードされ、gccは警告を表示しません。

+0

ポインタ値を整数として格納するには、 'stdint.h'の' intptr_t'か 'uintptr_t'を使うべきです。さもなければ、精度を失う危険があります(あるいは、精度を得ることは、変換時に失われ、同様の問題を引き起こす可能性があります)。 –

+0

Chrisに問題がなければ、レガシーコードではないでしょう...近代化の一環として、あなたの推薦は賢明です。 'some_char_buffer'が実際には' unsigned char'(あるいは 'unsigned char')でないかぎり、質問の中の' const char * 'キャストはおそらく必要ないでしょう。 –

+0

@JonathanLeffler - 私はコード部分にスキップするのはひどい傾向があり、最初の行には「レガシーコード」という言葉が全くありませんでした。私はちょっとばかげていると感じています... –

答えて

-2

はこれを試してください:あなたはおそらく行うことができます:addressの内容を想定し

strcmp((char*)&address, (const char*)some_char_buffer); 
2

は本当にただのポインタある

strcmp ((char*)address, (const char*)some_char_buffer); 

しかし、そのような場合、それははるかに良いだろう代わりにアドレスをchar*に変更してください。

char* address; 

あなたのコードベースによっては、より大きな変更があるかもしれません。なぜそれが最初の場所のポインタではなくunsigned long longであったのか知っていますか? 、(というよりもコンテンツaddressがポイントかもしれません)の操作を行います:


代わりにしたい場合は、addressの内容のバイトは、文字列として扱われる

strcmp ((char*)&address, (const char*)some_char_buffer); // note the & 

注意をこの場合、longの最後のバイトを'\0'にする必要があります。これがあなたの望むことならば、私の代わりに、長い長いの大きさに制限strncmp()を使用してお勧めします:

strncmp((char*)&address, (const char*)some_char_buffer, 
     sizeof(unsigned long long)); 
+0

'NULL'('(void *)0')はNULLポインタで、ASCII NUL( ''\ 0'')はCの文字列の最後に来ます。彼らはたとえ同じ価値を持っていても交換できません。 –

+0

@ChrisLutzかなり正しい、修正されました: –

2

あなたのコードは、おそらくaddressためuintptr_tを使用する必要があります。どちらか

uintptr_t address = ...; 
strcmp((const char *)address, some_char_buffer); 

を(私は。標準はunsigned long longは、それが実際には、多くの場合、ない場合でも、ポインタを保持するのに十分なビットを持っていることを保証を与えるとは思わない)ことや、あなたが醜さと一緒に暮らすことができる場合、

unsigned long long address = ...; 
strcmp((const char *)(uintptr_t)address, some_char_buffer); 
+0

+1のための 'uintptr_t'をお勧めします –

+4

2番目のオプションで' uintptr_t'を使ってキャスティングすることは実際的なメリットはありません。 'address'の値が既に切り捨てられていると、遅すぎます。 – caf

+0

2番目のオプションでgccをシャットダウンするのは、例えば(何らかの理由で) 'strtoull'の結果を' address'変数に代入している場合などです。実際、最初のキャスト(1つは 'uintptr_t address = strtoul ...')は、1つのキャストを暗黙の変換に置き換えることができるため、優先されます。 –

関連する問題