WwangHB 发表于 2020-8-2 23:26:50

关于结构体指针向大佬求助

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

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

int main(void)
{
      int i, j;

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

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

                printf("请输入学生姓名 成绩:\n");
                scanf("%s%f%f%f", p.name, &p.scores, &p.scores, &p.scores);

      for(i = 0; i < 3; i++)
      {
                printf("%s\n", p.name);
                printf("%.1f %.1f %.1f\n", p.scores, p.scores, p.scores);
      }

/*      for(i = 0; i < 3; i++)
      {
                free(p.name);
                free(p.scores);
      }
*/
      return 0;
}



1、为什么这个打印的时候第一个名字打印不出来?(打印结果如下,测试了很多次第一个名字都是乱码)
请输入学生姓名 成绩:
张三 2 2 2,
请输入学生姓名 成绩:
李四 3 3 3,
请输入学生姓名 成绩:
王五 4 4 4,
x      �
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)
/lib/libc.so.6(+0x73691)
./a.out
/lib/libc.so.6(__libc_start_main+0xe8)
./a.out
======= 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         
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         
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         
Aborted

sunrise085 发表于 2020-8-2 23:51:11

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

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

另外第23行少个大括号

风过无痕1989 发表于 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.name = (char *)malloc(sizeof(char) * 21);
                p.scores = (float *)malloc(sizeof(float) * 3);

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

      /*      for(i = 0; i < 3; i++)
      {
                free(p.name);
                free(p.scores);
      }
       */
      return 0;
}
页: [1]
查看完整版本: 关于结构体指针向大佬求助