1

背景: ソケット セッションの一部として配列を char* として受け取っています。ここで、トークン (HTTP ヘッダー) を一致させる必要があります。ここでのコードは、UBYTE* を作成し、UBYTE で型キャストした後に char 配列から値を取得したことです。後で同じ UBYTE ポインターを、char* に型キャストした後に char* を受け入れる他の関数に渡します。

ここでの問題は、これがデバッグ ビルドではなくリリース ビルドで機能することです (-g と異なる最適化を使用)。デバッグモードでいくつかの印刷を追加するだけでなく、問題が隠されます。

ここでの私の質問は、UByte ポインター (本質的に符号なしの char) と char ポインターの違いは何ですか。UByte を char に変更すると、すべてのモードで問題が解決しますが、同じことについて説明がありませんか? 何かご意見は ?

4

2 に答える 2

3

char *と の間でキャストしても問題はありませんunsigned char *。最適化レベルによって異なる予期しない動作が発生する場合は、コードにバグがあることは確かですが、キャストで署名を破棄することとはほとんど関係がない可能性があります。

それとは別に、UBYTEはかなりばかげた typedef です。なぜなら、標準の C 型 が存在するためuint8_tですstdint.h

于 2010-07-14T08:38:17.907 に答える
1

そもそも、なぜ an を使用しなければならなかったのか、最初に説明できますunsigned charか? そして、機能しないとはどういう意味ですか?

void*char*およびunsigned char*異なるセマンティクスを持っているため、それに応じて使用する必要があります。

  • void*実際の型にキャストしない限り何もできない不特定のデータを指します
  • char*残念ながら、テキスト文字列として、または不特定のデータとして 2 つの異なる意味がありますが、低 (バイト) レベルでアドレス指定 (パッチ) される可能性があります
  • signed charおよびunsigned charは、算術を実行する幅の狭い整数です
于 2010-07-14T08:57:16.387 に答える