video 44图书馆(动态申请结构体)
malloc函数为结构体分配存储空间
video44 构建图书馆m,每个元素指向一个动态申请架构体变量的指针。
#include <stdio.h> //上面程序的结构体指针
#include <stdlib.h>
struct Date;//声明
struct Date{
int year;
int month;
int day;
}date;
struct Book;//声明
struct Book{
char title[128];
char author[40];
float price;
struct Date date;
char publisher[40];
}book;
void getInput(struct Book *book);//声明,与非指针版本不同,不用返回值。因为直接通过指针就能修改数据,所以定义为void即可
void getInput(struct Book *book)//这个结构图函数用作接受输入,也就是说得到的输入值,给book这个结构体;函数的变量是结构体,输出结构体型;
{
printf("请输入书名:");
scanf("%s",book->title );
printf("请输入作者:");
scanf("%s",book->author );
printf("请输入售价:");
scanf("%f", &book->price);//输入数字需要加上&
printf("请输入日期:");
scanf("%d-%d-%d", &book->date.year, &book->date.month,&book->date.day);//输入数字需要加上&
printf("请输入出版社:");
scanf("%s", book->publisher );
};
void printBook(struct Book *book);
void printBook(struct Book *book)
{ //结构体整体做参数,就要定义出一个结构体x的形式出来
printf("书名:%s\n", book->title);
printf("作者:%s\n", book->author);
printf("售价:%.2f\n", book->price);
printf("日期:%d-%d-%d\n", book->date.year,book->date.month, book->date.day);//嵌套多少层,多少点
printf("出版社:%s\n", book->publisher);
}
int main(void)
{
struct Book *b1, *b2;//定义两个临时结构体
b1=(struct Book *)malloc(sizeof(struct Book));//malloc返回的是void的指针,所以可以转化为任何类型的指针,括号为强制转换为指向book结构体的指针,b1,b2是指针。因为申请的内存空间放在堆中,需要free。
b2=(struct Book *)malloc(sizeof(struct Book));
if (b1== NULL || b2==NULL)//或语句,检查分配
{
printf("内存分配失败?\n");
exit(1);//添加头文件,stdlib.h
};
printf("请录入第一本书的书名\n");
getInput(b1);//给一个地址,直接在上面修改得到新的结构体
putchar('\n');
printf("请录入第二本书的书名\n");
getInput(b2);
putchar('\n');
printf("录入完毕,打印第一本书的信息\n");
printBook(b1);//打印结构体
putchar('\n');
printf("现在,打印第二本书的信息\n");
printBook(b2);
free(b1);
free(b2);
return 0;
}