首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

一路指针,内存布局题C

2012-10-25 
一道指针,内存布局题C【摘自CSDN】#includestdio.hintmain(){inta[5]{1,2,3,4,5}int*ptr1(int*)(&a+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;}


第一个,&a 取得地址以后加一的操作,指针增加了sizeof(a)这么多的绝对地址。这应该是指针加了20,然后一个-1有减去了4,这样相当于指针的绝对地址加了16,指向的就是a[4]的首地址

第二个,加的是绝对内存地址,假如原来是0x0001,加完了以后是0x0002
然后再考虑pc的小端存储(little endian)
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;

在我的机器LINUX上运行结果:

5,2000000

热点排行