免费注册 查看新帖 |

Chinaunix

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

[C] 有多少C程序员认为这是错误的写法 [复制链接]

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
11 [报告]
发表于 2012-09-03 23:45 |显示全部楼层
本帖最后由 Ager 于 2012-09-03 23:46 编辑
pmerofc 发表于 2012-09-03 23:41
难的是真弄出点事情来(据说是真有安全隐患)
真的让错“表现”出来
很多人一下子就接受了


这种纠结,属于关于“元叙事”的困惑。

你要“真弄出点事情来”,那你就得去精心构造。

构造之前,必须对“元叙事”进行解构,用哲学的话说:你在干一件后现代主义的活儿。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
12 [报告]
发表于 2012-09-04 01:15 |显示全部楼层
OwnWaterloo 发表于 2012-05-12 16:14
单看T a[M][N];确实有这种可能性:
T* p = &a[0][0];
通过 p (类型为T*)的计算只能保证正确 &a[0][0] 到 &a[0][N] 之间的元素,对超过&a[0][N]的部分(并不一定恰好在&a[0][N],也许在之后的某个点)可能会发生回绕。于是结果就乱七八糟。
而T* q = &a[1][0]; 通过q,才能保证正确访问 &a[1][0] 到 &a[1][N]之间的元素。


但结合malloc(还有union等东西),如果编译器敢这么设计T* p的指针格式,那么:
T* p = (T*)malloc(M * N * sizeof(T) ); // 或者按你在56楼的写法, p = (T*)malloc(sizeof(T[N*M])) 或calloc
p 也无法访问被分配出来的所有空间。



我不知道怎么准确的描述……总之,可能存在单个object大小(也许是一个数组object)远小于地址空间的情况。
也存在字长不能寻址整个地址空间,于是编译器只能用两个机器字来拼出一个指针。
在这种情况下,对指针运算,编译器为了效率,只改这两个机器字中的一个而忽略另一个也是合乎C规范的。这种实现的可能性也是存在的。


但这单个object,可以被解释为任意类型(包括某种结构体,包括解释为一维/多维数组对象)。
编译器为了效率,在节省了一个机器字改动的情况下,应该会尽量宽松,尽量让另一个能寻址这单个object的任意位置。
而不会更严格,不会为了检查出更多不合乎C规范的错误,做出更多限制。


这个,要关注一下。

:)

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
13 [报告]
发表于 2012-09-04 20:30 |显示全部楼层
本帖最后由 Ager 于 2012-09-04 20:41 编辑

@pmerofc

@hbmhalley


pmerofc 发表于 2012-09-04 19:54
  就是这里
   

    If the pointer operand points to an element of an array object,



     这句话应该是指针加法的一个前提条件,对于二维数组,这里的element应该是指的是某个一维数组



实在有点不好意思 …… 我有点糊涂了 ……

“ If the pointer operand points to an element of an array object ...” 这句话应该不被 pscore + 5 * i + j 这个表达式所适用吧?

pscore是一个“points to an element of an array object”的operand吗?

pscore只是一个float *,它怎么知道自己“points to an element of an array object”

糊涂了,请大虾们多提醒提醒 ……





论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
14 [报告]
发表于 2012-09-04 21:10 |显示全部楼层
本帖最后由 Ager 于 2012-09-04 21:20 编辑

@pmerofc

pmerofc 发表于 2012-09-04 20:42
这个pscore指向的是一维数组的元素


与其说“pscore指向的是一维数组的元素”,不如说:“pscore指向的是一个float元素” —— 元素在这里,只是在array这个观念下才呈现出来的观念 —— 所以,更不如说:

pscore指向的是一个float。(这就是它在被定义的时候,编译器赋予它的本真含义。)

我所感兴趣的关键,是:

float * pscore = * score;  ——  编译器能否透过这么一个初始化式,将“array”及由“array”所产生的“element”这些属性(或信息),也加赋到pscore身上?

我的理解是:在上述初始化式中,编译器无非是把一个float *的数据值(这个数据值,可以由任何表达式得到,只要类型无二致),单纯地copy给了pscore变量。请允许我这么说。

编译器除了检查 * score 这个表达式的类型是否符合初始化等号左边的pscore的类型(即float *)(显然符合)之外,pscore 并不会“被知道”它自己should be a pointer points 二维数组的元素的元素,还是三维数组的元素的元素的元素,还是四维数组的元素的元素的元素的元素,还是压根儿就没有数组的单独一个float。

{:3_185:}





论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
15 [报告]
发表于 2012-09-05 04:36 |显示全部楼层
本帖最后由 Ager 于 2012-09-05 04:39 编辑

@OwnWaterloo

@hbmhalley

@pmerofc

OwnWaterloo 发表于 2012-09-04 22:55
回复 395# Ager

幸好我有拍照过,就p[x]与*(p+x)这事的来龙去脉在 104# 楼。

    Array subscripting, Semantics

    A postfix expression followed by an expression in square brackets [] is a subscripted designation of a member of an array object.
    The definition of the subscript operator [] is that E1[E2] is identical to (*(E1+(E2))) .


p[x]就是根据*(p+x)定义的。

你遇见过"完全相同的表达式被编译为不同的汇编代码"这种情况没有?
按你的说法,因为它们产生的汇编代码不同,所以两个表达式是不等价的?即使两个表达式完全相同?荒唐。


冤枉 …… ow大虾莫怒 ……

大虾 …… 我在上面不是说了嘛 —— “等价”的观念又该如何理解?被比较的两方,将在哪一个层面上被做关于“等价”的判断?

我觉得吧,像我这种(不代表更多的人)玩(不是用也不是开发更不是对其做学术)计算机的人,reading、programming和hacking的乐趣,就是在于挖掘看似平坦的叙事下被掩盖的泥沼与崎岖,发现看似“本来应该如此”下的“原来不是如此”。

在大虾上列的引文中,“be identical to”到底是什么意思?我是不甘心按照惯常叙事的语境势态,去被迫接受一个概念的;就算去查考词源(identical一词有“被视为等同”的含义,有亲缘义的词有“identifier”(标识符)等)也无法轻易挥去我的疑虑;上列引文的标题,虽然已经明示了“Semantics”这个前提,但这实际上令它要陈述的事情离我所关心的东西更远了。

所以,如果我有能力与技巧,去亲手揭示出“be identical to”这件事情,到底是发生在哪一个环节(或哪一个层面)的,我就觉得很开心了 —— 这不是“扣字眼”的乐趣,也是一种亲自经历了我原来未曾经历的事情的乐趣。比如,ow大虾你在本帖第88楼的发言,我就很喜欢(特地mark了)。

OwnWaterloo 发表于 2012-09-05 00:03
回复 395# Ager

关于什么是人生攻击,我记得那帖就是你发的吧?


ow大虾,不明白你的这句话 …… {:3_185:}

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
16 [报告]
发表于 2012-09-06 08:08 |显示全部楼层
OwnWaterloo 发表于 2012-09-05 14:39
回复 437# Ager

先说"人生攻击"那帖,我记错了,不是你发的。。。


没事儿,呵呵{:3_193:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP