免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123456
最近访问板块 发新帖
楼主: zdmilan
打印 上一主题 下一主题

地址相减的结果? [复制链接]

论坛徽章:
0
51 [报告]
发表于 2009-02-10 20:54 |只看该作者
要是想得到元素个数

        int array[10];
        printf( "array's length is: %d \n", (int *)(*(&array+1))-array );


要是想得到空间大小

        int array[10];
        printf( "array's length is: %d \n", (char *)(*(&array+1))-(char *)array );

论坛徽章:
0
52 [报告]
发表于 2009-02-11 09:20 |只看该作者
原帖由 zdmilan 于 2006-8-17 15:13 发表
int *p1;
int *p2;
p1 = (int *)0x500;
p2 = (int *) 0x509;
value = p2-p1;
printf("value=%d \n",value);

这个value 应该等于多少,为什么?

首先value的类型没有给出,我这里默认为int类型。
004114CC  rep stos    dword ptr es:[edi]
        int *p1,*p2,value;

        p1 = (int *)0x509;
004114CE  mov         dword ptr [p1],509h
        p2 = (int *)0x500;
004114D5  mov         dword ptr [p2],500h

        value = p1 - p2;
004114DC  mov         eax,dword ptr [p1]
004114DF  sub         eax,dword ptr [p2]
004114E2  sar         eax,2
004114E5  mov         dword ptr [value],eax

        cout  << "value =" << value;
004114E8  mov         esi,esp
004114EA  mov         eax,dword ptr [value]
004114ED  push        eax
在VS 2005中的反汇编代码如上,结果为2.即在int * 转向 int类型时要考虑类型长度,以上代码稍作修改
value =(int)p1 - (int)p2; 显式的结果即为9.

论坛徽章:
0
53 [报告]
发表于 2009-02-14 23:43 |只看该作者
原帖由 flyingtime 于 2009-2-11 09:20 发表

首先value的类型没有给出,我这里默认为int类型。
004114CC  rep stos    dword ptr es:[edi]
        int *p1,*p2,value;

        p1 = (int *)0x509;
004114CE  mov         dword ptr [p1],509h
        p2 = (int *)0 ...

说得很好!解释得很清楚.

论坛徽章:
0
54 [报告]
发表于 2009-02-15 12:14 |只看该作者
这种行为在标准中是未定义的 未定义的意思是即使现在所有的编译器的实现都是相同的但是你不能保证 过去他们是相同的 或者未来他们还会相同。永远不要写这种未定义行为的代码,除非你知道你在做什么。

论坛徽章:
0
55 [报告]
发表于 2009-02-24 12:59 |只看该作者
原帖由 accelerator 于 2007-5-23 23:05 发表


有谁来回答我的疑问, THX.

填充……最后该struct的大小为2*sizeof int

论坛徽章:
0
56 [报告]
发表于 2009-02-24 19:42 |只看该作者
原帖由 whyglinux 于 2007-5-23 20:53 发表
根据标准的规定,&a 表达式的含义是计算 a 的地址(address),它的结果也是一个指针(pointer)。在语言层面上说某一个对象的地址的时候,它不单具有一个具体的地址值,还总是伴随着这个对象的类型,所以地 ...

有人把C叫作中级语言,意思是介于高级语言与低级语言之间的语言,当然,其实质还是高级语言。如果一种语言能涉及到地址,或能操控地址,那它还能称之为高级语言吗?
当指针pa与pb均指向同一数组时,pa-pb返回的是两者相差几个元素而不是相差的“地址值”(打引号是因为我一直没在C里找到“地址”)。指针加减常数,也是同样道理。
我是先学汇编后学C的。在学C时,一直没在里面找到“地址”。
地址是操作系统分配的。C里面没有地址。如果有地址,它就连中级语言也做不成了。
至于第三点,你说唯心,可能是我没说明白。我的意思是,这类代码,只是在嵌入式之类里才有意义。

论坛徽章:
0
57 [报告]
发表于 2009-02-24 19:51 |只看该作者
原帖由 kuaizaifeng 于 2006-8-17 17:21 发表


为啥不让相加??


因为两个地址相加没有意义没有意义
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP