鱼C论坛

 找回密码
 立即注册
查看: 905|回复: 4

[已解决]结构体指针问题

[复制链接]
发表于 2020-6-3 22:18:39 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Justin1 于 2020-6-4 08:17 编辑

再用结构体指针写图书馆代码的时候,需要用到指针数组,且数组里的每一个元素都得指向结构体。
然后我写了一个代码
  1. i = 0;
  2.         char *p[n];
  3.         while( i < n )
  4.         {
  5.                 struct Book p[i];
  6.                 p[i] = (struct Book *)malloc(sizeof(struct Book));
复制代码

我的思路是这样子的
我需要一个指针数组,那么我先申明一个n个指针的数组(n的话已知,已经输入进去了)
然后进入循环 循环条件 为 i < n(后面代码是有 i +=1的 我闲啰嗦没贴)
好的接下来 p[i]是p数组的元素,也就是个指针 ,我让它指向结构体Book
之后,我用malloc申请一个大小和结构体一样大空间返回值为结构体指针的地址   并将它赋值给p[i]这个指针

但是我运行了程序
6.3error.png
大概意思都是说类型不匹配

后来我对代码进行了一些修改,
改成了 struct Book *book[n];就可以运行了

这我就有点不理解了

第一次写的代码(有错)如下
  1. #include <stdio.h>
  2. #include <stdlib.h>


  3. //struct Date  struct Book   void getInput(*p)  void PBooks(*p)
  4. struct Date
  5. {
  6.         int year;
  7.         int month;
  8.         int day;
  9. }date;

  10. struct Book
  11. {
  12.         char title[100];
  13.         char author[40];
  14.         float price;
  15.         struct Date date;
  16.         char publisher[100];
  17. };

  18. void getInput(struct Book *book);
  19. void PBooks(struct Book *book);

  20. void getInput(struct Book *book)
  21. {
  22.         printf("请输入书名:");
  23.         scanf("%s",book->title);
  24.         printf("请输入作者:");
  25.         scanf("%s",book->author);
  26.         printf("请输入价格");
  27.         scanf("%f",&book->price);
  28.         printf("请输入出版日期");
  29.         scanf("%d-%d-%d",&book->date.year,&book->date.month,&book->date.day);
  30.         printf("请输入出版社");
  31.         scanf("%s",book->publisher);
  32.        
  33. }

  34. void PBooks(struct Book *book)
  35. {
  36.         printf("书的名字是:%s",book->title);
  37.         printf("书的作者是:%s",book->author);
  38.         printf("书的价格是:%.2f",book->price);
  39.         printf("书的出版日期是:%d-%d-%d",book->date.year,book->date.month,book->date.day);
  40.         printf("书的出版社是:%s",book->publisher);
  41. }
  42.   

  43. int main(void)
  44. {
  45.         int n;
  46.         int i = 0 ;
  47.        
  48.         printf("*请输入你要存放的书本的个数:");
  49.         scanf("%d",&n);
  50.        
  51.         i = 0;
  52.         char *p[n];
  53.         while( i < n )
  54.         {
  55.                 struct Book p[i];
  56.                 p[i] = (struct Book *)malloc(sizeof(struct Book));
  57.                 printf("这本书开始输入");
  58.                 if(p[i] == NULL)
  59.                 {
  60.                         printf("分配内存失败");
  61.                         exit(1);
  62.                 }
  63.                 getInput(p[i]);
  64.                 printf("*这本书输入完毕*");
  65.             putchar('\n');
  66.             printf("这本书开始打印:");
  67.                 PBooks(p[i]);
  68.                 printf("*这本书打印完毕*");
  69.                 free(p[i]);
  70.         }
  71.         putchar('\n');
  72.        
  73.         return 0;
  74. }
复制代码



这是修改后可以运行的代码

  1. #include <stdio.h>
  2. #include <stdlib.h>


  3. //struct Date  struct Book   void getInput(*p)  void PBooks(*p)
  4. struct Date
  5. {
  6.         int year;
  7.         int month;
  8.         int day;
  9. };

  10. struct Book
  11. {
  12.         char title[100];
  13.         char author[40];
  14.         float price;
  15.         struct Date date;
  16.         char publisher[100];
  17. };

  18. void getInput(struct Book* book);
  19. void PBooks(struct Book* book);

  20. void getInput(struct Book* book)
  21. {
  22.         printf("请输入书名:");
  23.         scanf("%s", book->title);
  24.         printf("请输入作者:");
  25.         scanf("%s", book->author);
  26.         printf("请输入价格");
  27.         scanf("%f", &book->price);
  28.         printf("请输入出版日期");
  29.         scanf("%d-%d-%d", &book->date.year, &book->date.month, &book->date.day);
  30.         printf("请输入出版社");
  31.         scanf("%s", book->publisher);

  32. }

  33. void PBooks(struct Book* book)
  34. {
  35.         printf("书的名字是:%s\n", book->title);
  36.         printf("书的作者是:%s\n", book->author);
  37.         printf("书的价格是:%.2f\n", book->price);
  38.         printf("书的出版日期是:%d-%d-%d\n", book->date.year, book->date.month, book->date.day);
  39.         printf("书的出版社是:%s\n", book->publisher);
  40. }

  41. int main(void)
  42. {
  43.         int n;
  44.         int i = 0;

  45.         printf("*请输入你要存放的书本的个数:");
  46.         scanf("%d", &n);


  47.         while (i < n)
  48.         {
  49.                 struct Book* book[i];
  50.                 book[i] = (struct Book*)malloc(sizeof(struct Book));
  51.                 printf("这本书开始输入");
  52.                 if (book[i] == NULL)
  53.                 {
  54.                         printf("内存分配失败");
  55.                         exit(1);
  56.                 }
  57.                 getInput(book[i]);
  58.                 printf("*这本书输入完毕*\n");
  59.                 putchar('\n');
  60.                 printf("这本书开始打印:\n");
  61.                 PBooks(book[i]);
  62.                 printf("*这本书打印完毕*\n");
  63.                 free(book[i]);
  64.                 i += 1;
  65.         }
  66.         putchar('\n');

  67.         return 0;
  68. }
复制代码
最佳答案
2020-6-3 22:30:00
本帖最后由 sunrise085 于 2020-6-3 22:31 编辑

修改前的程序,有个地方写错了。
while循环前,char*p[n]改为struct Book* p[n]就可以了。
类型写错了。
然后把第62行去掉
6.4rror.png
6.41.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-3 22:27:55 | 显示全部楼层
指针也是有类型的!
而且你的 struct Book p[i]; 我着实没看懂。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 22:30:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-6-3 22:31 编辑

修改前的程序,有个地方写错了。
while循环前,char*p[n]改为struct Book* p[n]就可以了。
类型写错了。
然后把第62行去掉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 07:35:57 | 显示全部楼层
sunrise085 发表于 2020-6-3 22:30
修改前的程序,有个地方写错了。
while循环前,char*p[n]改为struct Book* p[n]就可以了。
类型写错了。
...

谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 08:22:42 | 显示全部楼层
sunrise085 发表于 2020-6-3 22:30
修改前的程序,有个地方写错了。
while循环前,char*p[n]改为struct Book* p[n]就可以了。
类型写错了。
...

还是有个小毛病。改了之后在devc++里运行成功了,但是viusal studio2019里报错,错误大概就是说不能输入变量表达式。一般是用devc++的,所以vs还不大习惯 6.4rror.png 6.41.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-14 06:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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