免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5949 | 回复: 29
打印 上一主题 下一主题

[C] 讨论下这个题目,请不要先编译 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-07 10:45 |只看该作者 |倒序浏览
#include <stdio.h>
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;
}

论坛徽章:
0
2 [报告]
发表于 2009-05-07 10:53 |只看该作者
ptr1的值不确定
ptr2 = 8

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [报告]
发表于 2009-05-07 10:54 |只看该作者
ptr1[-1] =11
&a+1是a的地址+1,可以看作是二重数组的下一个地址了,即相当于a[5]的为止了,退回一个位置,应该就是11这里了。
第二个不太清楚

论坛徽章:
0
4 [报告]
发表于 2009-05-07 10:58 |只看该作者
第一个是十进制的11,因为&a+1被当作了把a当作二维数组,指向第二行第一个,ptr1[-1]就是第一维的最后一个
第二个是十进制的8

论坛徽章:
0
5 [报告]
发表于 2009-05-07 11:00 |只看该作者
ptr1 跟字节对齐有关吧,有人实测过ptr1、ptr2吗?

论坛徽章:
0
6 [报告]
发表于 2009-05-07 11:25 |只看该作者
第一个没有争议,就是 b。

现在看第二个。

32-bit, LE:
  07 00 00 00 : 08 00 00 00 : 09 00 00 00 : 0A 00 00 00 : 0B 00 00 00

32-bit, BE:
  00 00 00 07 : 00 00 00 08 : 00 00 00 09 : 00 00 00 0A : 00 00 00 0B

16-bit, LE:
  07 00 : 08 00 : 09 00 : 0A 00 : 0B 00


可以看出:

32 位小端字节序,结果是 8000000h;
32 位大端字节序,结果是 700h;
16 位小端字节序,结果是 800h。




[ 本帖最后由 langue 于 2009-5-7 11:28 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-05-07 11:30 |只看该作者
原帖由 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 编辑 ]

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2009-05-07 11:31 |只看该作者
可能会总线错误吧

论坛徽章:
0
9 [报告]
发表于 2009-05-07 11:31 |只看该作者
还跟小端表示和大端表示有关系,7楼的图表意很清晰

[ 本帖最后由 daybreakcx 于 2009-5-7 11:34 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-05-07 11:33 |只看该作者
原帖由 langue 于 2009-5-7 11:25 发表
第一个没有争议,就是 b。

现在看第二个。

32-bit, LE:
  07 00 00 00 : 08 00 00 00 : 09 00 00 00 : 0A 00 00 00 : 0B 00 00 00

32-bit, BE:
  00 00 00 07 : 00 00 00 08 : 00 00 00 09 : 00 00  ...


强烈支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP