- ベストアンサー
c言語の配列の先頭アドレスが偶数アドレスとなる理由について
c言語の配列の先頭アドレスが偶数アドレスとなる理由について 下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。 /*list0105*/ #include <stdio.h> main() { char na=1; char nb=1; char c[2] ={1,2}; char s[3] = {1,2,3}; char nc=1; char nd=1; printf("%p\n",&na); printf("%p\n",&nb); printf("%p %p \n", &c[0],&c[1] ); printf("%p %p %p \n", &s[0],&s[1] ,&s[2] ); printf("%p\n",&nc); printf("%p\n",&nd); } 実行結果 0xbffff8cf 0xbffff8ce 0xbffff8cc 0xbffff8cd ← c配列 0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列 0xbffff8af 0xbffff8ae
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
メモリの配置はコンパイラとコンパイルオプションに依存します。 デフォルトだと、32ビットのメモリ処理単位=4バイトとか8バイトが多いかと。 理由は32ビットCPUが4バイト単位でメモリにアクセスするのでアクセス効率を優先したためです。 例えば、 0xbffff8cc 0xbffff8cd ← c配列 0xbffff8ce 0xbffff8cf 0xbffff8d0 ← S配列 だとしたら、S配列の内容全てを参照するためにCPUは0xbffff8ccと0xbffff8d0の合計8バイトにアクセスする必要が出てきます。無駄ですよね。
その他の回答 (1)
- beefisdead
- ベストアンサー率63% (92/145)
お礼
回答ありがとうこざいます。S配列 は、CPUのメモリ処理単位4バイトなので、4の倍数のアドレス(0xbffff8b0 )にすれば、アクセスは4バイトで、アクセスは、効率的であると把握しました。今後ともよろしくお願いします。