免费注册 查看新帖 |

Chinaunix

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

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

choc 该用户已被删除
31 [报告]
发表于 2007-05-13 14:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
32 [报告]
发表于 2007-05-13 15:03 |只看该作者
原帖由 MMMIX 于 2007-5-12 19:23 发表

C 语言的实现实在是太多太广了,各种各样、林林总总、不一而足。C 中的许多问题,即使是一些看似比较简单的问题,要想说的准确而详尽,都不是一件简单的事情,更非三言两语所能做到。



其实C本来很简单很美好的,只是很多人喜欢把简单的问题复杂化,于是C就不美好起来了。

其实我现在已经很少去看这些语言方面细枝末节的地方了,自己写代码的时候按照规范走,就不会出什么大的问题,可是我发现很多人喜欢钻这种问题的牛角尖,问一些“行为无定义”的问题。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
33 [报告]
发表于 2007-05-13 15:09 |只看该作者
原帖由 converse 于 2007-5-13 15:03 发表
其实C本来很简单很美好的,只是很多人喜欢把简单的问题复杂化,于是C就不美好起来了。

最根本的原因还是 C 的实现太广了。
其实我现在已经很少去看这些语言方面细枝末节的地方了,自己写代码的时候按照规范走,就不会出什么大的问题,可是我发现很多人喜欢钻这种问题的牛角尖,问一些“行为无定义”的问题。

主要还是经验不足,另外就是受一些不好的书籍误导、又没有看那些经典优秀的书籍。

再有就是相同的语言在不同的人那里作用/意义是不同的,也许你只是用该语言写程序,因此一些隐秘的角落你不需要关心,但是对于需要实现该语言编译器/解释器的人来说,清楚的了解这些就是必要的了。

[ 本帖最后由 MMMIX 于 2007-5-13 15:13 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2007-05-14 22:26 |只看该作者
原帖由 flw2 于 2007-5-12 18:40 发表
movl    $1024, -4(%ebp)
        movl    $1033, -8(%ebp)
        movl    -4(%ebp), %edx
        movl    -8(%ebp), %eax
        subl    %edx, %eax
        sarl    $2, %eax

这就是
int *p = (i ...



昏死个人呀,最近正在学习汇编,看了半天没看明白.后来上网查才知道windows上的汇编和linux上的汇编不一样的.gcc采用的是AT&T的汇编格式,MS采用Intel的格式.谁能提供一本linux上汇编书.

论坛徽章:
0
35 [报告]
发表于 2007-05-14 22:41 |只看该作者
汇编语言程序设计,Richard Blum

论坛徽章:
0
36 [报告]
发表于 2007-05-15 10:59 |只看该作者
感觉C语言比较灵活,简洁,正在学习中。

论坛徽章:
0
37 [报告]
发表于 2007-05-15 12:46 |只看该作者
whyglinux 说得很对,标准规定,只有数组中的地址才可以减

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
38 [报告]
发表于 2007-05-15 13:18 |只看该作者
通过指针相减来求元素个数具有不可移值性。
因为其结果有可能是错误的。LZ的例子是一个,另一个是内存模型(如:DOS编程)

论坛徽章:
0
39 [报告]
发表于 2007-05-20 09:40 |只看该作者
1)指针相减不等于地址相减。
2)如果指针指向一个数组,则指针可以加减一个整数,这表示指针在数组里的移动。两个都指向同一数组的指针,可以相减。
3)指针相减,具有可移植性。但是,有一个前提,你得把指针看作是指针。如果你把指针看作是地址,那它就没有可移植性。

论坛徽章:
0
40 [报告]
发表于 2007-05-20 20:15 |只看该作者
有点不明白:
如果因为边界对齐问题会导致崩溃, 那下边的结构体定义肯定是非法
#pragma pack(1)
struct s {
         char c;
         int i;
};
i完全可能不在一个对齐的地址上.

个人觉得, 指针减法并没有什么副作用, 真正需要小心的还是解引用这一步, 保证解引用的地址有效即可. 每看过标准, 感觉是这样.

[ 本帖最后由 accelerator 于 2007-5-20 20:17 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP