| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3229 人关注过本帖
标题:深入指针笔记二
只看楼主 加入收藏
LShang
Rank: 4
来 自:China
等 级:业余侠客
威 望:3
帖 子:183
专家分:258
注 册:2010-12-24
收藏
得分:0 
以下是引用有容就大在2012-7-29 09:43:29的发言:

也就是说const修饰符并不是想的那么厉害,也可能被修改。这算
不算一个C语言的漏洞,我自己是无意修改,但保不齐别人利用这个
漏洞来捣乱。

C的设计逻辑本来不就是相信程序员自己知道自己做什么嘛,如果非要改逻辑上不可改的,那也没办法咯,自由嘛,有得必有失吧

学如逆水行舟,不进则退
士不可以不弘毅,任重而道远
2012-07-29 10:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
34楼的测试,是未定义行为,关键之处在那个指针强制转型的语句!

授人以渔,不授人以鱼。
2012-07-29 11:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C++语言强制规定,const的对象只能用const指针指向,所以在34楼的代码中,指针才被迫写成强制转型,否则编译不通过,这点有容自己非常清楚。也就是说,编译器已经知道你会出问题,但你既然明确要转型,它也不拦着,只能随你愿,其结果是未定义行为,所以两种代码两种现象,一个能改原值,一个不能改(不能改的那个相当怪异,不知道其*p值是怎么来的,同一个地址,居然有两个不同的值,这点我专门跟踪过,无法解释)。至于C代码,其实也一样,同样报出那个错误,也是必须要转型才通过的。

C++不赞成使用C的旧式转型语法,所以提供了四种不同的转型语法。34楼的转型,在编译时实际上被执行为const_cast<int*> &x,即把对象的const取消掉,但事实上x对象所在的位置,极可能是真的无法修改的,所以x有时能被改掉,有时不能,结果不确定,这取决于编译器把x数据放在哪里。《C++编程规范》中有五、六条告诫很强烈地警告不要频繁使用转型,说如果代码中转型语句太多即意味着代码编写不良,要考虑重新设计,特别地是reinterpret_cast类的转型(C转型语法视不同环境被编译器实现为某种C++的转型,更令程序员没意识已经写下危险的代码),比如多态使用数组之类,union也是与reinterpret_cast类似的行为但更阴险。

其实,34楼代码中强制转型,就非常突兀,程序员写出这样的代码,就应该再三追问自己:为什么要这样做?

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 TonyDeng 于 2012-7-29 12:51 编辑 ]

授人以渔,不授人以鱼。
2012-07-29 12:27
zuylin
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2012-7-29
收藏
得分:0 
回复 35楼 有容就大
大牛可以这么理解吗?int a[100000];是全局变量,系统会帮忙初始化为0的,不过是存放在.bss段!而手动初始化为0的数组全局变量应该是在栈中,而且是在.data段中,在.data中存放的是数据不是0.

[ 本帖最后由 zuylin 于 2012-7-29 15:15 编辑 ]
2012-07-29 14:32
yguowei
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-7-29
收藏
得分:0 
回复 楼主 谢均杰
高手,好好学习一下
2012-07-29 20:17
快速回复:深入指针笔记二
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048002 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved