因此,我正在编写一个程序,以扫描许多学生的姓名和成绩,然后向我显示所有平均年龄在85岁以上的学生。 我必须使用结构,并且说明说我必须借助strlen函数为名称动态分配内存。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stud
{
char *name;
int marks[4];
float avg;
}student;
student* Create_Class(int);
void Avg_Mark(student*);
void Print_One(student*);
int main()
{
int size, i;
student *arr;
printf("\nEnter the number of students: ");
scanf("%d", &size);
arr = (student*)malloc(size * sizeof(student));
arr = Create_Class(size);
for (i = 0; i < size; i++)
{
if ((arr + i)->avg > 85)
Print_One(arr + i);
}
for (i = 0; i < size; i++)
free((arr[i].name));
free(arr);
return 0;
}
student* Create_Class(int size)
{
struct stud *Arr;
int i, j, k;
char YourName[51];
int length;
Arr = (struct stud*)malloc(size * sizeof(struct stud));
for (i = 0; i < size; i++)
{
printf("Enter your name: ");
scanf(" %s", YourName);
length = strlen(YourName);
(Arr + i)->name = (char*)malloc(length * sizeof(char));
for (k = 0; k < length; k++)
(Arr + i)->name[k] = YourName[k];
(Arr + i)->name[k] = '\0';
printf("Enter your marks: ");
for (j = 0; j < 4; j++)
scanf("%d", &(Arr + i)->marks[j]);
}
for (i = 0; i < size; i++)
Avg_Mark(Arr + i);
return Arr;
}
void Avg_Mark(student* s)
{
int i;
float sum = 0;
for (i = 0; i < 4; i++)
{
sum += s->marks[i];
}
s->avg = sum / 4;
}
void Print_One(student* s)
{
printf("The average of %s is %.1f\n", s->name, s->avg);
}
似乎问题在于释放主函数中的名称字段指针。 有人可以告诉我出了什么问题吗? 该代码本身非常简单,因此,如果有任何不清楚的地方,请随时提出,我将尽可能详细。
答案 0 :(得分:2)
您的代码中有两个问题。
您正在通过调用C:\Tool
arr
内存
create_class
这将导致内存泄漏,因此只需删除arr = (student*)malloc(size * sizeof(student));
arr = Create_Class(size);
。
您没有为arr = (student*)malloc(size * sizeof(student));
字段分配足够的内存。
name
应该{{1}}来容纳length = strlen(YourName);
(Arr + i)->name = (char*)malloc(length * sizeof(char));
个字符。