新手用vs2017 输入数据报错 c语言

图片说明图片说明图片说明

 #include <stdio.h>
#include <stdlib.h>
struct student
{
    int number;
    int de;
    int cai;
    int grade;
    int sum=de+cai;
};
typedef struct student* man;
int com(const void *a, const void *b)
{
    man s1 = *(man *)a;
    man s2 = *(man *)b;
    if (s1->grade != s2->grade) return s2->grade - s1->grade;
    else if (s1->sum != s2->sum)   return s1->sum - s2->sum;
    else if (s1->de != s2->de)     return s1->de - s2->de;
    else if (s1->number != s2->number)   return s2->number - s1->number;
    else                        return 0;

}
int judge(man s, int c, int d)
{
    if (s->cai < c || s->de < c) return 0;
    else if (s->cai < d&&s->de < d)  return 1;
    else if (s->cai >= d && s->de < d) return 2;
    else if (s->de >= d && s->cai < d) return 3;
    else if (s->cai >= d && s->de >=d) return 4;
}
int main()
{

     man a[100];
     int b, c, d;
     scanf_s("%d %d %d", &b, &c, &d,8888);
     int i;
     int flag = 0;
     for (i = 0; i < b; i++)
     {   
         man s = (man)malloc(sizeof(struct student));
         scanf_s("%d %d %d", s->number, s->de, s->cai,8888);
         if (s->grade=judge(a[i], b, c) )
         {
             a[flag] = s;
             flag++;
         }
         free(s);
     }
     qsort(a, flag, sizeof( man), com);
     printf("%d\n", flag);
     for (int i = flag - 1; i >= 0; i--)
         printf("%d %d %d\n",a[i]->number, a[i]->de, a[i]->cai);
     system("pause");
     return 0;

}


大佬们咋回事
p://img.ask.csdn.net/upload/201801/29/1517210935_834748.png)

你后面的if (s->grade = judge(a[i], b, c));首先.数组a里面全是野指针...然后你调用judge方法...让一个指针去指向了这个野指针,然后想要去得到这片区域的值...不报错才怪..

scanf_s("%d %d %d", &b, &c, &d,8888);
8888是什么?肯定是无效的地址啊。

man是结构体指针类型,则a就是结构体指针的数组,他们只是保存了数据结构块的地址,
所以free(s);不应该放在循环内释放,应该放在程序最后,循环释放前面申请的空间

老哥...你调用scanf_s的时候,后面的参数切记是地址啊...而不是整数类型的... scanf_s("%d %d %d", &s->number, &s->de, &s->cai,8888);

scanf("%d %d %d", &b, &c, &d); scanf_s不是所有的编译器都可以用,建议你换会scanf输入
在源程序的开头加上 #define use _CRT_SECURE_NO_WARNINGS 1