鱼C论坛

 找回密码
 立即注册
查看: 2094|回复: 11

[已解决]请求大佬解答指针问题

[复制链接]
发表于 2019-6-5 22:47:55 | 显示全部楼层 |阅读模式

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

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

x
  1. void max_ave_sco(Student *student)
  2. {
  3.         float *ave_sco = stu_ave_sco(student);

  4.         int max = 0;
  5.         for (int j = 1; j < 10; j++)
  6.         {
  7.                 if (ave_sco[max] < ave_sco[j])
  8.                 {
  9.                         max = j;
  10.                 }
  11.         }
  12.         ave_sco[max];
  13.         printf("平均分最高的学生\n");
  14.         printf("姓名:%s\n",student[max].name);
  15.         printf("语文成绩:%d\n", student[max].language);
  16.         printf("数学成绩:%d\n", student[max].math);
  17.         printf("英语成绩:%d\n", student[max].english);
  18. }
复制代码



有如上代码:经过调试,在for循环中ave_sco[max](也就是第8行)的值正常,但是一旦出了for循环,ave_sco[max](第13行)的值立马就变为负数了,请问什么情况;

float *ave_sco = stu_ave_sco(student);   这行代码:因为 stu_ave_sco返回值是个浮点型的数组,所以用指针接收
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-5 22:54:09 | 显示全部楼层
可以提供完整的代码吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-5 22:55:50 | 显示全部楼层
本帖最后由 我叫MD 于 2019-6-5 22:58 编辑
人造人 发表于 2019-6-5 22:54
可以提供完整的代码吗?

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

  3. /*
  4. 12.编写程序,用一个数组存放学生信息,每个学生信息包括学号,姓名,三门课程的成绩。从键盘输入10个数据,要求:
  5. 1.输出每门课程的平均成绩
  6. 2.输出每个学生的总分和平均成绩
  7. 3.输出平均分最高的学生数据
  8. 4.输出每门课程高于平均成绩的学生人数
  9.                 5.输出每个学生第一门课程与平均成绩的分差
  10.                 6.输出所有课程分数最高的学生
  11.                 7.输出每门课程分数最高的学生
  12.                 8.输出第一门课程不及格的学生

  13. */

  14. //先创建学生的结构体
  15. typedef struct Student
  16. {
  17.         unsigned int stu_num;
  18.         int language;
  19.         int math;
  20.         int english;
  21.         char name[20];

  22. }Student;

  23. //先录入10个学生的信息
  24. void inputinfo(Student *student)
  25. {
  26.         for (int i = 0; i < 10; i++)
  27.         {
  28.                 printf("请输入第%d个学生的信息:\n", i + 1);
  29.                 printf("学号:");
  30.                 scanf("%d", &student[i].stu_num);
  31.                 printf("姓名:");
  32.                 scanf("%s", student[i].name);
  33.                 printf("语文成绩:");
  34.                 scanf("%d", &student[i].language);
  35.                 printf("数学成绩:");
  36.                 scanf("%d", &student[i].math);
  37.                 printf("外语成绩:");
  38.                 scanf("%d", &student[i].english);

  39.         }
  40. }

  41. //返回语文课程的平均成绩
  42. float language_sco(Student *student)
  43. {
  44.         float language = 0;

  45.         for (int i = 0; i < 10; i++)
  46.         {
  47.                 language += student[i].language;
  48.         }

  49.         return language / 10;
  50. }

  51. //返回数学课程的平均成绩
  52. float math_sco(Student *student)
  53. {
  54.         float math = 0;

  55.         for (int i = 0; i < 10; i++)
  56.         {
  57.                 math += student[i].math;
  58.         }

  59.         return math / 10;
  60. }

  61. //返回英语课程的平均成绩
  62. float english_sco(Student *student)
  63. {
  64.         float english = 0;

  65.         for (int i = 0; i < 10; i++)
  66.         {
  67.                 english += student[i].english;
  68.         }

  69.         return english / 10;
  70. }

  71. //返回学生的总分
  72. float* stu_all_soc(Student *student)
  73. {
  74.         float student_allsocre[10] = { 0 };

  75.         for (int i = 0; i < 10; i++)
  76.         {
  77.                 student_allsocre[i] = student[i].language + student[i].math + student[i].english;
  78.         }

  79.         return student_allsocre;
  80. }

  81. //返回学生的平均分
  82. float* stu_ave_sco(Student *student)
  83. {
  84.         float student_avesocre[10] = { 0 };
  85.         float *student_avesoc = stu_all_soc(student);

  86.         for (int i = 0; i < 10; i++)
  87.         {
  88.                 student_avesocre[i] = *(student_avesoc + i) / 3;
  89.         }

  90.         return student_avesocre;
  91. }

  92. //3.输出平均分最高的学生数据
  93. void max_ave_sco(Student *student)
  94. {
  95.         float *ave_sco = stu_ave_sco(student);

  96.         int max = 0;
  97.         for (int j = 1; j < 10; j++)
  98.         {
  99.                 if (ave_sco[max] < ave_sco[j])
  100.                 {
  101.                         max = j;
  102.                 }
  103.         }
  104.         //ave_sco[max];
  105.         printf("平均分最高的学生\n");
  106.         printf("姓名:%s\n",student[max].name);
  107.         printf("语文成绩:%d\n", student[max].language);
  108.         printf("数学成绩:%d\n", student[max].math);
  109.         printf("英语成绩:%d\n", student[max].english);
  110. }

  111. //4.输出每门课程高于平均成绩的学生人数
  112. void four(Student *student)
  113. {
  114.         int language_ave = language_sco(student);
  115.         int math_ave = math_sco(student);
  116.         int english_ave = english_sco(student);

  117.         int language_num = 0, math_num = 0, english_num = 0;

  118.         for (int i = 0; i < 10; i++)
  119.         {
  120.                 if (student[i].language > language_ave)
  121.                 {
  122.                         language_num++;
  123.                 }
  124.                 if (student[i].math > math_ave)
  125.                 {
  126.                         math_num++;
  127.                 }
  128.                 if (student[i].english > english_ave)
  129.                 {
  130.                         english_num++;
  131.                 }
  132.         }

  133.         printf("语文高于平均成绩的学生人数是:%d\n", language_num);
  134.         printf("数学高于平均成绩的学生人数是:%d\n", math_num);
  135.         printf("英语高于平均成绩的学生人数是:%d\n", english_num);
  136. }

  137. int main()
  138. {
  139.         Student student[10];

  140.         inputinfo(student);
  141.         max_ave_sco(student);
  142.         four(student);

  143.         system("pause");
  144.         return 0;
  145. }
复制代码


我把目前的所有代码赋值上来了,不好意思,新手,写代码杂乱不规范,可能不利于阅读,主要看下返回学生的平均分那段代码就好了,其他的代码和问的问题不关联
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-5 23:14:42 | 显示全部楼层
  1. sh-4.4$ gcc -g -Wall -o main main.c
  2. main.c: In function 'stu_all_soc':
  3. main.c:97:16: warning: function returns address of local variable [-Wreturn-local-addr]
  4.          return student_allsocre;
  5.                 ^~~~~~~~~~~~~~~~
  6. main.c: In function 'stu_ave_sco':
  7. main.c:111:16: warning: function returns address of local variable [-Wreturn-local-addr]
  8.          return student_avesocre;
  9.                 ^~~~~~~~~~~~~~~~
  10. sh-4.4$
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-5 23:15:22 | 显示全部楼层    本楼为最佳答案   
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-6-5 23:38:06 | 显示全部楼层

感谢,我明白了,不过我的编译器没有报错,不知道是编译器问题还是因为我是.cpp文件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-5 23:38:52 | 显示全部楼层
我叫MD 发表于 2019-6-5 23:38
感谢,我明白了,不过我的编译器没有报错,不知道是编译器问题还是因为我是.cpp文件

你用的是哪个编译器?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-5 23:39:28 | 显示全部楼层
人造人 发表于 2019-6-5 23:38
你用的是哪个编译器?

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

使用道具 举报

发表于 2019-6-5 23:41:12 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-5 23:48:32 | 显示全部楼层

我刚才又看了一下,果真报警告了   但是一般我只关心是否生成成功,所以就没注意那个警告

在问一个问题  怎么发图片的  这边我点图片需要输入图片地址  怎么获取地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-5 23:53:12 | 显示全部楼层
我叫MD 发表于 2019-6-5 23:48
我刚才又看了一下,果真报警告了   但是一般我只关心是否生成成功,所以就没注意那个警告

在问一个问 ...

1.png
2.png
3.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-6-6 00:43:56 | 显示全部楼层

再次感谢您的慷慨回答,感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 14:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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