下面的C代码在VC++6.0下的运行结果是什么?请详细说明原因。
#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;
}
答案:
5,2000000
解析:
查看一下内存分布情况:
int a[5]={1,2,3,4,5};
则程序的内存分配(即高地址在前低地址在后)为
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
/|/
|
a
第一点:
int *ptr1=(int *)(&a+1);
首先,&a获得的是数组的地址,这样增长的单元则成了sizeof(a)=20
这样ptr1指向a[5](当然,数组的下标是从0开始,因此正常只有0-4有效.)
ptr1[-1]相当于ptrl-1,也就相当于a[4],因此输出为5.
第二点:
int *ptr2=(int *)((int )a+1);
(int )a==>能过强制类型转换,此时的(int)a只为一个般的int型值.其值为a[0]的地址.
(int)a+1==>其值为a[0]的地址+1
int *ptr2=(int *)((int )a+1);==>此时指向的地址为0000 00 02
相当于数值0200 00 00(十进制为:33554432)
最后由于
printf("%x",*ptr2);==>要求输出为16进制的格式,当然就是2000000