F0T1024 发表于 2020-2-18 12:00:46

一个关于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都成功了,但是在输入两行后程序突然报错,显示该程序已停止工作,程序终止,这是怎么回事,是代码哪里有问题吗?

superbe 发表于 2020-2-18 14:13:56

把这两行:
    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]
查看完整版本: 一个关于C++结构体的题目