1本のポインタ、メモリレイアウト問題C
【CSDNより抜粋】
1つ目は,&aがアドレスを取得した後に1つ追加する操作で,ポインタはsizeof(a)のような絶対アドレスを増やした.これはポインタに20が加算され、1つ-1が4が減算されるべきであり、これはポインタの絶対アドレスに16が加算され、a[4]のヘッダアドレスを指す
第2、プラスしたのは絶対メモリアドレスで、もしもとは0 x 001ならば、プラスし終わった後に0 x 002です
次にpcのリトルエンドストレージ(little endian)を考慮する
aのメモリ格納
住所:00 01 02 03 04 06
データ:01 00 00 00 00 02 00
a = 00;
ptr2 = (int*)((int)a + 1);
ptr2 = 01;
ptr 2が指すメモリは
住所:01 02 03 04
データ:00 00 00 02
すなわち*ptr 2=0 x 200000;
これはlittle-endianの場合です.
big-endianであれば、結果は違います.
aのメモリ格納
住所:00 01 02 03 04 06
データ:00 00 00 00 01 00 02
ptr 2が指すメモリは
住所:01 02 03 04
データ:00 00 00
*ptr2 = 0x100;
私のマシンLINUXで実行した結果:
5,2000000
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int )a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
1つ目は,&aがアドレスを取得した後に1つ追加する操作で,ポインタはsizeof(a)のような絶対アドレスを増やした.これはポインタに20が加算され、1つ-1が4が減算されるべきであり、これはポインタの絶対アドレスに16が加算され、a[4]のヘッダアドレスを指す
第2、プラスしたのは絶対メモリアドレスで、もしもとは0 x 001ならば、プラスし終わった後に0 x 002です
次にpcのリトルエンドストレージ(little endian)を考慮する
aのメモリ格納
住所:00 01 02 03 04 06
データ:01 00 00 00 00 02 00
a = 00;
ptr2 = (int*)((int)a + 1);
ptr2 = 01;
ptr 2が指すメモリは
住所:01 02 03 04
データ:00 00 00 02
すなわち*ptr 2=0 x 200000;
これはlittle-endianの場合です.
big-endianであれば、結果は違います.
aのメモリ格納
住所:00 01 02 03 04 06
データ:00 00 00 00 01 00 02
ptr 2が指すメモリは
住所:01 02 03 04
データ:00 00 00
*ptr2 = 0x100;
私のマシンLINUXで実行した結果:
5,2000000