| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 451 人关注过本帖
标题:[讨论]这个运行结果有点奇怪.
只看楼主 加入收藏
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
 问题点数:0 回复次数:5 
[讨论]这个运行结果有点奇怪.

谁能解释下这个这是为什么.
#include <iostream.h>

class Test
{
public:
int danger[2];
virtual void hello(void)
{
cout<<"Hello!"<<endl;
}
};
void myFun(void)
{
cout<<"You are danger!"<<endl;
}
Test obj1,obj2,*pobj;
void main()
{

pobj=&obj2;
pobj->hello();
int *pfun=(int *)(int)&myFun;
obj1.danger[3]=(int)&pfun;
pobj->hello();
}

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

[此贴子已经被作者于2006-11-13 14:31:21编辑过]

搜索更多相关主题的帖子: 结果 运行 
2006-11-13 14:29
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
你这样做是什么用意?故意乱搞?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-11-13 15:48
云中雾
Rank: 1
等 级:新手上路
威 望:1
帖 子:168
专家分:3
注 册:2005-12-30
收藏
得分:0 

什么意思?


白色的忧郁让我白色的思念从洁白到苍白,从苍白到空白,比空白更空白,变成深白的坦白!
2006-11-13 16:19
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
不是故意搞乱的.这是老师给的一个程序,叫我们分析下为什么如此定义数组是危险的?

这个例子如果是在main函数里面定义对象则会报一个需要调试的错误,如果是全局的就会有如上结果.

还有定义不同长度的数组输出内容不一样,也就是说obj1.danger[3]=(int)&pfun;是依据int danger[2];(这里改为int danger[3];也是如上结果)得到的,如果任意改变随便一个[]中的值,所得到的结果是:
Hello!
Hello!

如果int danger[2];定义成私有的或保护的,输出结果就是:
Hello!
Hello!

我想知道的就是为什么这样定义公共数组是危险的?

2006-11-13 21:58
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
我在MinGW Developer Studio上面运行,输出2个hello!

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-11-14 07:26
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
以下是引用wfpb在2006-11-14 7:26:18的发言:
我在MinGW Developer Studio上面运行,输出2个hello!

确实选用MinGW编译器会输出两个Hello! 但是VC的编译器则会输出一楼的结果,这好象是VC的编译器没有对数组做越界检查的缘故.
在考虑到最坏的情况下,斑竹能否给出一楼结果的原因呢?

我认为是这样的:
因为这个数组定义的是公有成员,而这些成员(包括函数)又都是存储在一块如同全局变量般的连续的内存中(原因就是Test obj1,obj2,*pobj;是全局的),就像全局变量一样,大家都可以用.当执行这两条语句时(int *pfun=(int *)(int)&myFun; obj1.danger[3]=(int)&pfun;),就相当于把obj1中的 virtual void hello(void);函数首地址改成了void myFun(void);的首地址,这样就达到了修改类中数据的目的.
而定义成私有或保护成员的话,则另开辟一块内存,即使执行了int *pfun=(int *)(int)&myFun; obj1.danger[3]=(int)&pfun;也达不到修改的目的.

不知道大家有什么看法?


2006-11-14 13:00
快速回复:[讨论]这个运行结果有点奇怪.
数据加载中...
 
   



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

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