鱼C论坛

 找回密码
 立即注册
查看: 522|回复: 2

[已解决]关于结构体指针向大佬求助

[复制链接]
发表于 2020-8-2 23:26:50 | 显示全部楼层 |阅读模式

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

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

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

  3. struct stud
  4. {
  5.         char *name;
  6.         float *scores;
  7. };

  8. int main(void)
  9. {
  10.         int i, j;

  11.         struct stud *p = (struct stud *)malloc(sizeof(struct stud *) * 3);

  12.         for(i = 0; i < 3; i++)
  13.         {
  14.                 p[i].name = (char *)malloc(sizeof(char) * 21);
  15.                 p[i].scores = (float *)malloc(sizeof(float) * 3);

  16.                 printf("请输入学生姓名 成绩:\n");
  17.                 scanf("%s%f%f%f", p[i].name, &p[i].scores[0], &p[i].scores[1], &p[i].scores[2]);

  18.         for(i = 0; i < 3; i++)
  19.         {
  20.                 printf("%s\n", p[i].name);
  21.                 printf("%.1f %.1f %.1f\n", p[i].scores[0], p[i].scores[1], p[i].scores[2]);
  22.         }

  23. /*      for(i = 0; i < 3; i++)
  24.         {
  25.                 free(p[i].name);
  26.                 free(p[i].scores);
  27.         }
  28. */
  29.         return 0;
  30. }
复制代码



1、为什么这个打印的时候第一个名字打印不出来?(打印结果如下,测试了很多次第一个名字都是乱码)
请输入学生姓名 成绩:
张三 2 2 2,
请输入学生姓名 成绩:
李四 3 3 3,
请输入学生姓名 成绩:
王五 4 4 4,
x      &#65533;
2.0 2.0 2.0
李四
3.0 3.0 3.0
王五
4.0 4.0 4.0

2、为什么去掉注释段(释放free)就会出现如下错误?
*** glibc detected *** ./a.out: double free or corruption (out): 0x08525018 ***
======= Backtrace: =========
/lib/libc.so.6(+0x70c31)[0x279c31]
/lib/libc.so.6(+0x73691)[0x27c691]
./a.out[0x8048614]
/lib/libc.so.6(__libc_start_main+0xe8)[0x21fd28]
./a.out[0x8048411]
======= Memory map: ========
00209000-0039a000 r-xp 00000000 fd:00 1787       /lib/libc-2.12.so
0039a000-0039c000 r--p 00191000 fd:00 1787       /lib/libc-2.12.so
0039c000-0039d000 rw-p 00193000 fd:00 1787       /lib/libc-2.12.so
0039d000-003a0000 rw-p 00000000 00:00 0
004e7000-00506000 r-xp 00000000 fd:00 1780       /lib/ld-2.12.so
00506000-00507000 r--p 0001e000 fd:00 1780       /lib/ld-2.12.so
00507000-00508000 rw-p 0001f000 fd:00 1780       /lib/ld-2.12.so
00dcc000-00de9000 r-xp 00000000 fd:00 1751       /lib/libgcc_s-4.4.7-20120601.so.1
00de9000-00dea000 rw-p 0001d000 fd:00 1751       /lib/libgcc_s-4.4.7-20120601.so.1
00e11000-00e12000 r-xp 00000000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 fd:00 25735      /home/fishc/heima/a.out
08049000-0804a000 rw-p 00000000 fd:00 25735      /home/fishc/heima/a.out
08525000-08546000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0
b7621000-b7700000 ---p 00000000 00:00 0
b77c1000-b77c2000 rw-p 00000000 00:00 0
b77ca000-b77ce000 rw-p 00000000 00:00 0
bf7f9000-bf80e000 rw-p 00000000 00:00 0          [stack]
Aborted
最佳答案
2020-8-2 23:51:11
本帖最后由 sunrise085 于 2020-8-3 00:07 编辑

第14行有问题
改为
  1. struct stud *p = (struct stud *)malloc(sizeof(struct stud ) * 3);//sizeof后面应该是结构体而非结构体指针
复制代码


另外第23行少个大括号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-2 23:51:11 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

本帖最后由 sunrise085 于 2020-8-3 00:07 编辑

第14行有问题
改为
  1. struct stud *p = (struct stud *)malloc(sizeof(struct stud ) * 3);//sizeof后面应该是结构体而非结构体指针
复制代码


另外第23行少个大括号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 00:06:07 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

struct stud
{
        char *name;
        float *scores;
};

int main(void)
{
        int i;

        struct stud *p = (struct stud *)malloc(sizeof(struct stud *) * 3);

        for(i = 0; i < 3; i++)
        {
                p[i].name = (char *)malloc(sizeof(char) * 21);
                p[i].scores = (float *)malloc(sizeof(float) * 3);

                printf("请输入学生姓名 成绩:\n");
                scanf("%s%f%f%f", p[i].name, &p[i].scores[0], &p[i].scores[1], &p[i].scores[2]);
        }                                       // 这里少了一个大括号
        for(i = 0; i < 3; i++)
        {
                printf("%s\n", p[i].name);
                printf("%.1f %.1f %.1f\n", p[i].scores[0], p[i].scores[1], p[i].scores[2]);
        }

        /*      for(i = 0; i < 3; i++)
        {
                free(p[i].name);
                free(p[i].scores);
        }
       */
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-17 05:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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