问题描述
为什么第一个是对应p[i].而第二个对应p[i]->我运行了下,为什么第二个运行正确,而第一个能运行但是输入两组数就未响应了?而且我把数组长度N定义为1就都正常了,为什么?
#include<iostream.h>#include<string.h>#define N 2class book{char name[5]; int sold;public:virtual char*getname(char*na)=0;virtual int getsold(int so)=0;virtual void printname()=0;virtual void printsold()=0;virtual void compare()=0;};class master:public book{char name[5]; int sold;public:master(){}char*getname(char*na){strcpy(name,na);return name;}int getsold(int so){sold=so;return sold;}void printname(){cout<<getname(name)<<endl;}void printsold(){cout<<getsold(sold)<<endl;}void compare(){if(sold>500){printname();}}};main(){magazine n1,n2;master m1,m2,m3,m4,m5;char name[N];int sold;book *p=new master[2]; //?book *y[2]={&n1,&n2};// magazine *t[10];cout<<'输入图书名字和销量:'<<endl;for(int i=0;i<=N-1;i++){cin>>name>>sold;p[i].getname(name); //?p[i].getsold(sold);}cout<<'销量大于500的图书:'<<endl;for(i=0;i<=N-1;i++){p[i].compare();}}
////////////////////////////////////////#include<iostream.h>#include<string.h>#define N 2class book{char name[5]; int sold;public:virtual char*getname(char*na)=0;virtual int getsold(int so)=0;virtual void printname()=0;virtual void printsold()=0;virtual void compare()=0;};class master:public book{char name[5]; int sold;public:// master(char* na,int so):name(na),sold(so){}char*getname(char*na){strcpy(name,na);return name;}int getsold(int so){sold=so;return sold;}void printname(){cout<<getname(name)<<endl;}void printsold(){cout<<getsold(sold)<<endl;}void compare(){if(sold>500){printname();}}};main(){magazine n1,n2;master m1,m2,m3,m4,m5;char name[N];int sold;book *p[2]={&m1,&m2}; //book *p[2]={&m1,&m1}不可,因为p[i]->getname(name)函数会改变m1的值,使p[1],p[2]值一样,p只是指针,核心为&m1book *y[2]={&n1,&n2};// magazine *t[10];cout<<'输入图书名字和销量:'<<endl;for(int i=0;i<=N-1;i++){cin>>name>>sold;p[i]->getname(name);p[i]->getsold(sold);}cout<<'销量大于500的图书:'<<endl;for(i=0;i<=N-1;i++){p[i]->compare();}}
问题解答
回答1:之前看错了,重新修改一下答案:
卧槽,原来是这么鬼畜的写法!!!
你new出来的是master[],而p是book*,怎么可以赋值过去啊~
所以当写成p[i]的时候,找到的那块内存地址是p+i*sizeof(book)而非p+i*sizeof(master)sizeof(book)和sizeof(master)又不相等!所以你的p[i]就是在内存中一块莫名其妙的卡在一半的地方,然后还把这个奇怪的地方当作master去操作,显然会出错啊!
至于为啥N为1的时候不报错,那是因为,这时候你只访问了一个p[0],既然i==0嘛,那上面的两个地址算出来是一样的咯