一个关于C++结构体的题目
本帖最后由 F0T1024 于 2020-2-18 12:10 编辑这是我的代码,大概用途是一个存书籍信息的代码:
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
struct Date
{
int year;
int month;
int day;
};
struct Book
{
string bookname;
string writername;
float price;
struct Date data;
string publisher;
};
//打印输入书籍信息
void Input(struct Book *book)
{
cout<<"请输入书名:";
cin>>book->bookname;
cout<<"请输入作者:";
cin>>book->writername;
cout<<"请输入价格:";
cin>>book->price;
cout<<"请输入出版日期:";
cin>>book->data.year>>book->data.month>>book->data.day;
cout<<"请输入出版社:";
cin>>book->publisher;
}
//输出书籍信息
void Print(struct Book *book)
{
cout<<"书名"<<book->bookname<<endl;
cout<<"作者名"<<book->writername<<endl;
cout<<"价格"<<book->price<<endl;
cout<<"出版日期"<<book->data.year<<"-"<<book->data.month<<"-"<<book->data.day<<endl;
cout<<"出版社"<<book->publisher<<endl;
}
//主函数,存两本书
int main()
{
struct Book *book1,*book2;
book1=(struct Book *)malloc(sizeof(struct Book));
book2=(struct Book *)malloc(sizeof(struct Book));
//malloc()函数由于申请分配内存空间,返回值的类型是一个void *指针
//所以采用(struct Book *)强制类型转化
if(book1==NULL || book2==NULL)
{
cout<<"内存分配失败!"<<endl;
exit(1);
}
cout<<"开始录入第一本书的信息:"<<endl;
Input(book1);
cout<<"开始录入第二本书的信息:"<<endl;
Input(book2);
cout<<"正在打印第一本书的信息:"<<endl;
Print(book1);
cout<<"正在打印第二本书的信息:"<<endl;
Print(book2);
free(book1);//释放分配的内存
free(book2);
return 0;
}
build和run都成功了,但是在输入两行后程序突然报错,显示该程序已停止工作,程序终止,这是怎么回事,是代码哪里有问题吗?
把这两行:
book1=(struct Book *)malloc(sizeof(struct Book));
book2=(struct Book *)malloc(sizeof(struct Book));
改成:
book1 = new Book;
book2 = new Book;
结构中包含了string类型成员,用malloc分配时,由于malloc没有这样的机制,导致无法调用string的构造函数,所以无法构建起string对象,给一个不存在的对象赋值肯定错误。但是new分配内存时有这样的机制,调用了string的构造函数,所以就构建起了对象,内存访问冲突就不会发生了。
参考链接:https://blog.csdn.net/jacke121/article/details/78463431
页:
[1]