啊哈磊_编程从这里起步

标题: 求解啊、、、、、动态内存的问题 [打印本页]

作者: w758736122    时间: 2012-8-18 13:06
标题: 求解啊、、、、、动态内存的问题
编译没有问题如果一个学生也没有问题,但是2个以上学生就挂掉了。。。求解,另外动态内存需要类似2级指针的处理吗??
# include <stdio.h>
# include <malloc.h>
struct student
{
int age;
double score;
int name;
};
void scan (struct student ** parr,int a)
{
int i;
for(i=0 ; i<a ; ++i)
{
parr[i]->name = i+1;
printf("\n请输入第%d个学生的年纪",i+1);
scanf ("%d", & parr[i]->age);//**,scanf(&)
printf("\n请输入第%d个学生的成绩",i+1);
scanf ("%g", & parr[i]->score);
}
}
void maopao (struct student ** parr,int len)
{
int a,b;
struct student * t; //a,b用于循环,t用于变换大小数
for(a=0; a<len-1 ; ++a)
for(b = 0; b<len-1-a; ++b)
if (parr[b]->score > parr[b+1]->score)
{
t = parr[b];
parr[b] = parr[b+1];
parr[b + 1] = t;
}

}
void print(struct student ** parr,int a)
{
int i;
for(i= 0 ; i<a ; ++i)
{
printf("%d\n",parr[i]-> name );
printf("%d\n",parr[i]-> age );
printf("%g\n",parr[i]-> score);
}
}
int main ()//学生管理系统【测试】
{
int a; // a 表示学生个数
int i; //i是内部循环用的
struct student * parr;
printf("学生管理系统\n");
printf("请输入有几个学生,学生个数= ");
scanf ("%d",&a);
parr = (struct student * )malloc(a * sizeof (struct student));
//parr是 struct student * 类型 //parr[0.1.2.3.4]

scan (& parr, a); //执行输入各个学生参数的函数
maopao(& parr,a); //执行成绩由高到低进行排序的函数
print (& parr,a); //试行输出
return 0;
}

作者: xchief    时间: 2012-8-18 13:06
你这里的  parr = (struct student * )malloc(a * sizeof (struct student));  这句不能放在这里 要放在scan循环里面去 就是说你放在这里 整个只分配一次空间 所以只有一个时有用,两个时就挂掉,你要放到循环里,每个人都要分配到一个空间  这样才行。另外你那里可以struct student * parr;不要这样定义,这样定义指针当数组用不好,要用//parr[0.1.2.3.4] 这种的 就定义struct student  parr[N]; 在这里没有必要用二重指针,只用数组名就行了void scan (struct student * parr,int a),另外说句无关紧要的,你结构里的name如果是代表学生名字的话,可以用char name[20];这样之类的 这样可以输名字,而不是数字,更加美观些



作者: 韩金选    时间: 2012-9-1 16:35
难度  五星  恩戈格
作者: 梦痞子    时间: 2012-9-1 20:03
可以尝试把malloc 换成  calloc   使用
例:
parr = (struct student *)calloc(a,sizeof(struct student));





欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2