免费注册 查看新帖 |

Chinaunix

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

[C] 请教一个基础问题——数组名减1是否可以 [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
201 [报告]
发表于 2009-12-20 18:41 |只看该作者

回复 #197 reiase 的帖子

原帖由 reiase 于 2009-12-20 16:36 发表
微软给出过一个实现,先在内存分配上作手脚,每个数组用一种特殊类型的内存包围,前边一块特殊内存,后边一块特殊内存,只要一越界访问到那种内存,就会触发一个windows异常(注意,是windows异常,不是C++异常!),然后在windows的结构化异常机制下处理下即可。


嗯, 我们要放弃编写干净的可移植的代码 :
for (int* p = a + n; p!=a; ) {
      --p;
      process( *p );
}
这是没有意义的!


有意义的是使用OS和compiler提供的特殊服务, 如crtdbg.h和SEH。
只有这样, 才能凸显代码十分牛逼经验如此丰富、充分了解OS、compiler、language的各种细枝末节与阴暗角落
才能在移植的时候出现莫名错误, 继而解决错误,再次凸显自己多才多艺, 才能在程序移植的时候能够再混一口饭吃

[ 本帖最后由 OwnWaterloo 于 2009-12-20 18:44 编辑 ]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
202 [报告]
发表于 2009-12-20 18:50 |只看该作者

回复 #201 OwnWaterloo 的帖子

补充一句: 才能让代码足够复杂, 以至于让人无法理解, 以至于自己不可替代

论坛徽章:
0
203 [报告]
发表于 2009-12-20 19:18 |只看该作者

回复 #198 OwnWaterloo 的帖子

这个不是我的意思,我没有针对谁的意思

我只是想:为了讨论,我们可以举一个很特殊的例子,当然我们还可以举一个更特殊的例子把特殊例子否掉...我只是在想,是否存在一个阈值,“邪恶程度”超过那个阈值的例子就无效无价值了,低于阈值的“邪恶例子”实际是好例子...某个“邪恶阈值”,一些讨论慢慢从技术转移到“邪恶阈值”如何确定上来了

其实标准也是个“邪恶阈值”而已,被新标准接受的提议,不都来自编译器的“非标准行为”吗

论坛徽章:
0
204 [报告]
发表于 2009-12-20 19:20 |只看该作者

回复 #201 OwnWaterloo 的帖子

如果不是为了用,这些特殊服务还有啥存在意义吗

论坛徽章:
0
205 [报告]
发表于 2009-12-20 19:36 |只看该作者
另外,分享一篇博文,关于邪恶的

http://kennethreitz.com/blog/why-ruby-scares-me/
Why Ruby Scares Me

Ruby scares me. It’s not the language that strikes fear in my heart, however; it is the community.

The Reasons
  • They treat Ruby as the Messiah — there is nothing better. There is nothing else. Only Ruby.
  • Community Leader Idol Wordship — did anyone catch the (online presence) death of _why?
  • “Now we can finally get things done”. — See next question.
  • Have you ever seen Ruby code? Look at below.
  • See Reason # 4.


  1. def remember(&a_block)
  2.   @block = a_block
  3. end

  4. remember {|name| puts "Hello, #{name}!"}

  5. @block.call("Jon")
  6. # => "Hello, Jon!"
复制代码

Can you really tell me, with a degree of certainty, what that’s supposed to do?

Please, just shoot me now.

[ 本帖最后由 reiase 于 2009-12-20 19:39 编辑 ]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
206 [报告]
发表于 2009-12-20 21:00 |只看该作者

回复 #205 reiase 的帖子

我也不想针对谁, 只是很多人在方法论上存在问题, 所以我不得不一次又一次的纠正。


原帖由 reiase 于 2009-12-20 19:18 发表
我只是想:为了讨论,我们可以举一个很特殊的例子,当然我们还可以举一个更特殊的例子把特殊例子否掉...我只是在想,是否存在一个阈值,“邪恶程度”超过那个阈值的例子就无效无价值了,低于阈值的“邪恶例子”实际是好例子...某个“邪恶阈值”,一些讨论慢慢从技术转移到“邪恶阈值”如何确定上来了


181楼 ……
lz的命题要证伪, 方法就是找特殊反例。 这并没有偏离lz的话题。
偏离lz话题的, 恰恰是那些认为例子很邪恶的, 或者是非要用一个又一个不特殊的实际例子去证明一个带有对任意谓词的命题为真。


原帖由 reiase 于 2009-12-20 19:18 发表
其实标准也是个“邪恶阈值”而已,被新标准接受的提议,不都来自编译器的“非标准行为”吗

这个说法很新颖。
但是, 直到标准加入类似"实现必须保证指针可以随意移动而不产生错误"的条款前, lz的命题就无法证明。
所以, 181楼说这个命题暂时无法证明, 只能证伪。


原帖由 reiase 于 2009-12-20 19:20 发表
如果不是为了用,这些特殊服务还有啥存在意义吗

他们存在的意义是为了不得已而为之, 而不是懂了就用

论坛徽章:
0
207 [报告]
发表于 2009-12-21 13:31 |只看该作者
关于本帖讨论的这个标准,我可不可以这么理解:

对指针进行加减运算,如果不能够确定指针加减的结果确切指向某个变量,其结果都是“未定义”的;
C标准规定必须为N个元素的数组分配连续的N+1个元素(“连续”不一定是物理上的连续,仅相对于指针的加减而言)。而其他情况下变量的位置都是不确定的,也就是说对指针进行加减运算没法确切指向它们。所以仅当参与加减运算的指针与结果处于同一数组的这N+1个元素之内时,结果才是确定的。

那么,非“未定义”的指针,来源就只有两个:一是由变量取地址(&i)的结果赋值而来;二是如上所述的经过“合法的”加减运算得到。


本人也和这里的很多人一样,C用得不少,但C标准关注得少。阅读本帖,受益非浅。上面的理解不当之处还望指正。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
208 [报告]
发表于 2009-12-21 14:51 |只看该作者

回复 #207 kouu 的帖子

我觉得分配N+1个元素应该不是必须的吧? 仅分配N个元素就足够了?
标准只要求实现能保证指针指向N+1个元素的时候不出问题即可,同时也说了,对N+1的访问是未定义的。
对0-N,标准不但要求指向不出问题, 访问也是有良好定义的。

合法指针的来源, 应该还有动态内存分配?

i386使得我们将内存理解为一个平坦的区域。 对象是这大块平坦区域上的一些小段
指针可以在整个区域上任意滑动。 甚至还可以越界, 从而指向其他对象。


但实际上, C标准并不保证所有对象都在同一个平坦区域上。
C标准给于的最低保证的情形类似于这样:
每个对象是一段连续的内存, 指针在特定的段上滑动是有意义的。
各个对象是相互独立的, 各段之间没有联系, 它们并不保证处在同一个大的区间上。 指针滑出对象的范围后,落入的不一定就是别的对象, 有可能回绕到自己, 有可能落入黑洞。
so …… 除非两个指针指向同一个数组, 否则指针的关系比较也是没有良好定义的了………………

int a[3];
int b[2];

if ( a < b  )  这个比较, C标准并不保证其含义, 是未定义还是由实现定义不记得了。(并不一定要C标准, the c programming language附录也有说明)
在i386上, 含义应该就是地址高地比较。


这个比较没有良好定义, 让我困惑了好一阵子, 但还是决定使用 ……
因为这个可以显著提高效率,标准在此提供的功能(他没有提供的保证)无法高效完成工作, 那就值得为其在不同平台上查阅其含义。

[ 本帖最后由 OwnWaterloo 于 2009-12-21 15:00 编辑 ]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
209 [报告]
发表于 2009-12-21 15:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
210 [报告]
发表于 2009-12-21 15:22 |只看该作者

回复 #206 OwnWaterloo 的帖子

>他们存在的意义是为了不得已而为之, 而不是懂了就用。

不太能赞同
再一个例子吧,在那个“没有编译器100%实现C++标准”的年代,标准是个啥玩意儿?纯YY?还是说编译器是纯YY?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP