指標地址的強制轉換(二)
阿新 • • 發佈:2020-12-21
0x01:程式碼
intmain()
{
int a[4]={1,2,3,4};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
這個題目百度問答裡邊有回覆的,但是存在問題,我們一起康康;
0x02:程式碼分析
ptr1: 將&a+1 的值強制轉換成int型別,賦值給int 型別的變數ptr,ptr1 肯定指到陣列a 的下一個int 型別資料了。ptr1[-1]被解析成*(ptr1-1),即ptr1 往後退4 個byte。所以其值為0x4; ptr2:a可以表示int型陣列首元素首地址,但是這裡使用(int)a做了強制型別轉換,陣列的型別為int型,所以(int)a+1 的值是 &a+sizeof(int)0x01。然後把這個地址強制轉換成int型別的值賦給ptr2,也就是說*ptr2 的值應該為&a+sizeof(int)*0x01的值,我們可以通過VS檢視記憶體佈局;
由記憶體中資料可知當前資料的儲存方式為大端模式,sizeof(int)=4,每個元素在記憶體中佔4位元組,通過上邊分析應該可以知道答案了,ptr1[-1] = *(ptr1-1) =0x4,*ptr2 = 2000000;
這樣看可能還是不夠明顯,看下面例子; 定義陣列a[]:
變數的值:
記憶體中的值:
輸出資訊: