- 论坛徽章:
- 0
|
原帖由 jiony 于 2009-5-7 10:45 发表 ![]()
#include
int main()
{
int a[5]={7,8,9,10,11};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int )a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
第一个,&a虽然和a值一样,但+1的概念跨越不一样,+1等于加5*4个字节,刚刚跑出数组范围,然后被转为int *,ptr1[-1] = *(ptr1 - 1),后退一个int, 即4个字节,得到11,即0xb
第二个,a即为a数组首元素地址, 地址在32位机器上是4字节,那么+1字节后,又强转为int *, 取4字节地址,在*ptr2的时候,跨越a[0],a[1], a[0]取3字节,a[1]取1字节,根据小尾数的规则:
a[0] = 0x00000007; a[1] = 0x00000008;
07 00 00 00 08 00 00 00
然后拼成 00 00 00 08 即为 0x08000000
大尾数的话相应就为 00 00 07 00 即为 0x700
[ 本帖最后由 bsdc 于 2009-5-7 12:01 编辑 ] |
|