免费注册 查看新帖 |

Chinaunix

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

挑战高手,看一行看不懂的代码. [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
41 [报告]
发表于 2004-12-23 12:28 |只看该作者

挑战高手,看一行看不懂的代码.

[quote]原帖由 "yuxh"]大家说的都是同一码事[/quote 发表:

没错,我和 assiss 说的正是同一码事。

论坛徽章:
0
42 [报告]
发表于 2004-12-23 12:32 |只看该作者

挑战高手,看一行看不懂的代码.

明白。了解。(擦一把冷汗,呼,长出一口气……)

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
43 [报告]
发表于 2004-12-23 12:36 |只看该作者

挑战高手,看一行看不懂的代码.

实际上,->; 运算符本身就有数学运算在里头,
所以不妨把那个宏当作是一个算术表达式,
看起来用到了指针,其实编译以后和指针没关系。
而指针越界只有在运行时才会发生,所以不会出错的。

论坛徽章:
0
44 [报告]
发表于 2004-12-23 14:22 |只看该作者

挑战高手,看一行看不懂的代码.

虽然俺勉强看得懂那代码,但还是要赞美一句"好帖"
flw讲解得尤其精彩很有条不紊

论坛徽章:
0
45 [报告]
发表于 2004-12-23 19:10 |只看该作者

挑战高手,看一行看不懂的代码.

那是否所有的 -> 运算符都可以看作算术运算,这样就跟指针没有关系,也就不访问指针了?

论坛徽章:
0
46 [报告]
发表于 2004-12-23 21:03 |只看该作者

挑战高手,看一行看不懂的代码.

原帖由 "flw" 发表:
实际上,->; 运算符本身就有数学运算在里头,
所以不妨把那个宏当作是一个算术表达式,
看起来用到了指针,其实编译以后和指针没关系。
而指针越界只有在运行时才会发生,所以不会出错的。

这个,偶还是不是很明白
  1. ((z*)0)->;w  //段错误
复制代码

  1. &((z*)0)->;w //正确
复制代码

个人感觉是"&"而不是"->;"使表达式成为了常量而不用在运行时访问内存。

论坛徽章:
0
47 [报告]
发表于 2004-12-23 21:59 |只看该作者

挑战高手,看一行看不懂的代码.

不就是offset?

论坛徽章:
0
48 [报告]
发表于 2004-12-24 09:52 |只看该作者

挑战高手,看一行看不懂的代码.

还是有点不明白,假如结构里面有多个变量,变量在实际的储存时可能不是按照顺序排列,那样偏移不是错了?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
49 [报告]
发表于 2004-12-24 09:56 |只看该作者

挑战高手,看一行看不懂的代码.

[quote]原帖由 "aladding"]还是有点不明白,假如结构里面有多个变量,变量在实际的储存时可能不是按照顺序排列,那样偏移不是错了?[/quote 发表:

假如结构里面有多个变量,变量在实际的储存时可能不是按照顺序排列

论坛徽章:
0
50 [报告]
发表于 2004-12-24 13:12 |只看该作者

挑战高手,看一行看不懂的代码.

twen345 说的两种类型不同
((z*)0)->;w  //段错误
涉及到了0代码的内存访问,这是不允许的
而代码:
&((z*)0)->;w //正确
我觉得是编译器识别了用户取((z*)0)->;w地址的意图,编译器在编译时是知道结构内部各变量的相对位置的,所以这里编译成汇编代码时他直接填入了当0地址的w地址值,因而执行时没有涉及到访问内存操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP