#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