求大神指教,跪求为什么下面的c++程序崩溃了?我估计是动态分配的问题。。

*************************************************该程序想实现未知数目的实例student信息的存储和输出student的... *************************************************该程序想实现未知数目的实例student信息的存储和输出
student的父类是cdate 为什么运行会崩溃??
跪求大神带!感激不尽啊!!
*************************************************
#include <iostream>
#include<string.h>
#include<malloc.h>
using namespace std;
class cdate{
int year;
int month;
int day;
public:
cdate(int y=0,int m=0,int d=0){year=y;month=m;day=d;}
void set_date()
{cout<<endl;
cin>>year;
cin>>month;
cin>>day;
}
int get_year(){return year;}
int get_month(){return month;}
int get_day(){return day;}
void display(){
cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
}
};
class student:public cdate
{
string sn;
string name;
int grade;
public:
student(){};
student(int y,int m,int d,string SN,string NAME,int g):cdate(y,m,d)
{
sn=SN;
name=NAME;
grade=g;
}
void set_student()
{
cout<<"学号,姓名,成绩,入学日期"<<endl;
cin>>sn;
cin>>name;
cin>>grade;
set_date();
}
void display();
};
void student::display()
{
cout<<"学号:"<<sn<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"成绩:"<<grade<<endl;
cout<<"入学日期:";
cdate::display();
}

int main(){
int j=1,i;
int n;
student r;
student *p;
r[1].set_student();
cout<<"1.添加0.结束"<<endl;
p=r;
cin>>n;
while(n!=0)
{
j++;
p=(student *)realloc(p,j*sizeof(student));//想实现一个可改变大小的实例存储
(p+j-1)->set_student();
cin>>n;
}
for(i=0;i<j;i++,p++)
p->display();
return 0;
}
展开
 我来答
濮方雅BX
2012-12-11 · TA获得超过4042个赞
知道大有可为答主
回答量:2482
采纳率:60%
帮助的人:2478万
展开全部
student r;
student *p;
r[1].set_student(); ====>为什么是r[1] ?
另外,如果用realloc的话,p事先要用malloc申请
你的程序中p指向了r,但r的位置在栈里,realloc要从堆上申请分配内存,二者不可比。所以我估计这句p=(student *)realloc(p,j*sizeof(student)是有问题的。
解决办法是一开始就让p用malloc申请动态内存,然后根据输入n,调用realloc动态调整
皇家救星1985
2012-12-11 · TA获得超过1131个赞
知道大有可为答主
回答量:1579
采纳率:0%
帮助的人:1674万
展开全部
realloc 后应该检查一下是否为空的

另外,realloc应该接收的是malloc分析的内存地址,不能是栈上变量的内存地址
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
水溥心0T
2012-12-11 · TA获得超过164个赞
知道小有建树答主
回答量:276
采纳率:100%
帮助的人:161万
展开全部
放个图啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式