suchen

Heim  >  Fragen und Antworten  >  Hauptteil

c++请问book *p=new master[2]; 和book *p[2]={&m1,&m2};的区别?

为什么第一个是对应p[i].而第二个对应p[i]->
我运行了下,为什么第二个运行正确,而第一个能运行但是输入两组数就未响应了?而且我把数组长度N定义为1就都正常了,为什么?

#include<iostream.h>
#include<string.h>
#define N 2
class 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 2
class 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只是指针,核心为&m1
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();}
}
PHP中文网PHP中文网2773 Tage vor356

Antworte allen(1)Ich werde antworten

  • 天蓬老师

    天蓬老师2017-04-17 14:32:19

    之前看错了,重新修改一下答案:


    卧槽,原来是这么鬼畜的写法!!!

    new出来的是master[],而pbook*,怎么可以赋值过去啊~

    所以当写成p[i]的时候,找到的那块内存地址是p+i*sizeof(book)而非p+i*sizeof(master)
    sizeof(book)sizeof(master)又不相等!所以你的p[i]就是在内存中一块莫名其妙的卡在一半的地方,然后还把这个奇怪的地方当作master去操作,显然会出错啊!

    至于为啥N为1的时候不报错,那是因为,这时候你只访问了一个p[0],既然i==0嘛,那上面的两个地址算出来是一样的咯

    Antwort
    0
  • StornierenAntwort