搜索
查看: 1622|回复: 3
打印 上一主题 下一主题

求解啊、、、、、动态内存的问题

[复制链接]
跳转到指定楼层
楼主
发表于 2012-8-18 13:06:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
编译没有问题如果一个学生也没有问题,但是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;
}

最佳答案

查看完整内容

你这里的 parr = (struct student * )malloc(a * sizeof (struct student)); 这句不能放在这里 要放在scan循环里面去 就是说你放在这里 整个只分配一次空间 所以只有一个时有用,两个时就挂掉,你要放到循环里,每个人都要分配到一个空间 这样才行。另外你那里可以struct student * parr;不要这样定义,这样定义指针当数组用不好,要用//parr[0.1.2.3.4] 这种的 就定义struct student parr[N]; 在这里没有必要用二重指针,只用 ...
楼主新帖
楼主热帖
沙发
发表于 2012-8-18 13:06:48 | 只看该作者
你这里的  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];这样之类的 这样可以输名字,而不是数字,更加美观些


评分

参与人数 1啊哈币 +5 收起 理由
lzl + 5 赞一个!

查看全部评分

板凳
发表于 2012-9-1 16:35:06 | 只看该作者
难度  五星  恩戈格
地板
发表于 2012-9-1 20:03:59 | 只看该作者
可以尝试把malloc 换成  calloc   使用
例:
parr = (struct student *)calloc(a,sizeof(struct student));
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表