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

查看:72
本文介绍了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();}
}

解决方案

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


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

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嘛,那上面的两个地址算出来是一样的咯

这篇关于c++请问book *p=new master[2]; 和book *p[2]={&amp;m1,&amp;m2};的区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆