1

私の知る限り、C プログラミング言語では、配列は要素ごとにメモリに格納されます。(つまり、要素 0、要素 1、要素 2、...、要素 n)。私は次のコードでそれを見ようとしています:

unsigned char a[] = { '\1' , '\2', '\3' ,'\4' };  
printf("%d\n", (int*) a);

unsigned char は 1 バイトで整数は 4 バイトなので、値を出力する必要があると思いました:

00000001 00000010 00000011 00000100 = 2^2 + 2^8 + 2^9 + 2^17 + 2^24 = 16909060

ただし、このプログラムを実行すると、試行ごとに異なる結果が生成されます。

ここで何が欠けていますか?

4

1 に答える 1

5

あなたはおそらく を使いたいと思うでしょう*(int *)a

ただし、これは実装定義の動作を呼び出します。

  • プラットフォームのエンディアンによって異なる結果が得られます。
  • プラットフォームによっては、char配列が として読み取られるように正しく配置されていない場合がありますint
  • charコンパイラは、配列を絶対に読み取らないという前提に基づいて、ファンキーな最適化を実行する場合があります。これは、厳密なエイリアシング規則int *として知られているものを破っています。
于 2012-04-30T17:42:27.817 に答える