Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81809
  • 博文数量: 17
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-17 21:47
文章分类

全部博文(17)

文章存档

2011年(1)

2008年(16)

我的朋友
最近访客

分类: C/C++

2008-03-04 21:56:33

一道简单的C语言题目,主要考查考生对C语言指针和内存布局的了解。
下面的C代码在VC++6.0下的运行结果是什么?请详细说明原因。
#include 
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;
}
 
&a 取得地址以后加一的操作,指针增加了sizeof(a)这么多的绝对地址。这应该是指针加了20,然后一个-1有减去了4,这样相当于指针的绝对地址加了16,指向的就是a[4]的首地址

第二个加的是绝对内存地址,假如原来是0x0001,加完了以后是0x0002
然后再考虑pc的小端存储
a 的内存存放
地址: 00 01 02 03 04 05 06 07
数据: 01 00 00 00 02 00 00 00
a = 00;
ptr2 = (int*)((int)a + 1);
ptr2 = 01;
所以ptr2指向的内存为
地址: 01 02 03 04
数据: 00 00 00 02
即*ptr2 = 0x2000000;
这是little-endian情况下。
如果是big-endian,结果不一样。
a 的内存存放
地址: 00 01 02 03 04 05 06 07
数据: 00 00 00 01 00 00 00 02
ptr2指向的内存为
地址: 01 02 03 04
数据: 00 00 01 00
*ptr2 = 0x100;
阅读(645) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~