注册 登录
编程论坛 C++教室

一个类与对象的程序,编译连接都没错误,运行结果也没错,就是弹出应用程序错误,调试的话,360阻止??不明白。那里出现错误了??

wenkaiche 发布于 2011-05-25 18:30, 1464 次点击
#include<cstring>
#include<iostream>
using namespace std;
class score
{int no;
char name[8];
int math;
int phi;
int data;
int ave;
public:
void write(int a,int b,int c,int d,char*p)
{no=a;math=b;phi=c;data=d;strcpy(name,p);name[sizeof(name)-1]='\0';}
void average()
{ave=(math+phi+data)/3;}
void display(score m)
{cout<<"学号"<<m.no<<"姓名"<<m.name<<"数学"<<m.math<<"物理"<<m.phi<<"数据结构"<<m.data<<"平均分"<<m.ave<<endl;}
};
int main()
{score s[3];
s[1].write(1001,80,70,60,"zhou");
s[1].average();
s[2].write(1002,90,80,85,"chen");
s[2].average();
s[3].write(1003,70,75,89,"wang");
s[3].average();
s[1].display(s[1]);
s[2].display(s[2]);
s[3].display(s[3]);
}
编译正确,连接正确,运行结果正确,然后出现:
2.exe-应用程序错误
"0x676e6177"指令引用的“0x676e6177”内存。该内存不能为“read”。若调试,360木马防火墙提示风险,怎么回事??
11 回复
#2
loveminttea2011-05-25 18:42
跟360没关吧,我都一直开着360呢
#3
specilize2011-05-25 18:51
s[3]数组引用可以这样的吗?有s[3]的吗?
#4
Pirelo2011-05-25 18:57
程序代码:
#include<cstring>
#include<iostream>
using namespace std;
class score
{private: //最好定义为私有成员,你什么都没定义
int no;
char name[8];
int math;
int phi;
int data;
int ave;
public:
void write(int a,int b,int c,int d,char*p)
{no=a;math=b;phi=c;data=d;strcpy(name,p);name[sizeof(name)-1]='\0';}
void average()
{ave=(math+phi+data)/3;}
void display(score m)
{cout<<"学号"<<m.no<<"姓名"<<m.name<<"数学"<<m.math<<"物理"<<m.phi<<"数据结构"<<m.data<<"平均分"<<m.ave<<endl;}
};
void main() //主函数还是声明为void类型吧,你后面什么都没返回
{score s[3];
s[0].write(1001,80,70,60,"zhou");  //root cause:你前面定义"score s[3];",后面接着却是s[1]、s[2]、s[3],下标越界了!!
s[0].average();
s[1].write(1002,90,80,85,"chen");
s[1].average();
s[2].write(1003,70,75,89,"wang");
s[2].average();
s[0].display(s[0]);
s[1].display(s[1]);
s[2].display(s[2]);
system("pause");
}


[ 本帖最后由 Pirelo 于 2011-5-25 19:04 编辑 ]
#5
lyj232011-05-25 19:28
void display(score m)

这个习惯不太好,拷贝对象会浪费时间!用引用或指针好些。
还有数组下标超出范围。
还有楼上的,
什么都没定义在class里就是private,在struct中就是public。
主函数声明为void在一些编译器里通不过编译。最好用int,以免不必要的麻烦,最后return 0
#6
Pirelo2011-05-25 20:54
回复 5楼 lyj23
这位大侠曲解了我的意思吧?我并没说数据成员一定是private或者public,在这里我们先不说class和C++中的structure的区别,
这仅仅只是一个提议,
我只是觉得既然大家选择了面向对象,那应该有个好的封装习惯:即把数据隐蔽起来,而成员函数作为对外的接口;我想这也是我们为什么要学习类的一个初衷。
诚然,你可以不用声明他们为private,甚至用structure,或是直接C代码去实现,我尊重这些实现的方法,但也保留自己的看法。
#7
linw12252011-05-25 22:09
标准的主函数貌似应该  int main
最后 写上  return 0;
#8
wenkaiche2011-05-26 22:58
回复 4楼 Pirelo
我晕,下标越界我明白了。。(没想到越了界还能出正确结果?!)那个private.我定义了,在类的头部定义可以省略private,视为私有成员。
#9
wenkaiche2011-05-26 23:11
回复 5楼 lyj23
的确应该用int main(),但是最后没必要加return 0吧,我课本上的int main都没return 0;我也不明白到底加与不加有什么区别。
反正不加return 0的话,点compile出现warning(1)。然后点build,warning就消失了。还请教你。
#10
wenkaiche2011-05-26 23:13
回复 5楼 lyj23
对了,还有,下标越界不是语法错误吗?为啥compile没有出现错误??
#11
wavewind2011-05-27 09:03
先回到上楼的一个数组下表越界的问题,首先你要建立一个概念,地址的概念,下标虽然已经超过的了数组所包含的地址,但是在内存中还是有这个访问的地址的存在,只是指向地址中的数据是难以控制的,这个也是导致最后程序错误的原因。

编译中出现的warn并不是说你非要修改后才能运行该程序,只有erro才是程序不能运行的关键。我们可以想一下,以前在c语言中如果出现这样的情况:
int i,j,k;
i=30;j=50;
k=j/i;
这样的情况明显是一个warn(警告),含义是把float类型的值赋值给了一个int型的变量,在c语言中涉及到一个类型强制传唤的问题,但是程序可以运行,运行时就可能获取错误。
#12
糊涂无罪2012-05-31 19:03
弱弱的问一句:程序最后的 pause 有什么用?
1