鱼C论坛

 找回密码
 立即注册
查看: 1284|回复: 1

[已解决]一个关于C++结构体的题目

[复制链接]
发表于 2020-2-18 12:00:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

最佳答案
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 01:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表