16

問題は簡単です。私が理解しているように、GCC は、32 ビット環境で char がバイト単位で整列され、int が 4 バイト単位で整列されることを維持しています。また、C99 標準 6.3.2.3 についても認識しています。これは、位置合わせされていないポインター型の間でキャストすると、未定義の操作が発生することを示しています。C の他の標準は、これについて何と言っていますか? ここには多くの経験豊富なコーダーもいます。

int *iptr1, *iptr2;
char *cptr1, *cptr2;

iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;
4

3 に答える 3

13

C の標準は 1 つ (ISO によるもの) しかなく、2 つのバージョン (1989 年と 1999 年) と、いくつかのかなりマイナーな改訂があります。すべてのバージョンとリビジョンは、次のことに同意します。

  • すべてのデータメモリはバイトアドレス指定可能で、文字はバイトです
  • したがって、char*任意のデータをアドレス指定できます
    • void*char*それとの間の変換が型キャストを必要としないことを除いて、 と同じです
  • int*からへの変換はchar*常に機能し、への変換は常に機能します。int*
  • char*任意のへの変換が機能することint*は保証されていません

char ポインターがこのように動作することが保証されている理由は、たとえば、整数をメモリ内の任意の場所からメモリまたはディスクの別の場所にコピーしたり、元に戻したりできるようにするためです。グラフィックライブラリなどのプログラミング。

于 2010-11-30T20:48:22.843 に答える
4

CPUにはビッグエンディアンとリトルエンディアンがあるため、結果は未定義です。たとえば、0x01234567の値は、キャスト後のcharポインタの場合は0x12または0x67になります。

于 2010-11-27T10:31:12.737 に答える
0

あなたはやってみることができます:

iptr1 = atoi(cptr1); // val now = pointed by cptr1
cptr2 = atoi(iptr2); // val now = pointed by iptr2

これはDevCppでうまくいきました!

于 2013-02-16T11:39:34.130 に答える