1本のポインタ、メモリレイアウト問題C


【CSDNより抜粋】

#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