所以我正在制作一个程序来扫描一些学生的姓名和成绩,然后向我展示所有平均为 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);
}
似乎问题在于释放主函数中的名称字段指针。有人能告诉我出了什么问题吗?代码本身非常简单,所以如果有任何不清楚的地方,请随时提问,我会尽可能详细。
您的代码中有两个问题。
您正在arr
通过调用覆盖内存create_class
arr = (student*)malloc(size * sizeof(student)); arr = Create_Class(size);
这将导致内存泄漏,因此只需删除arr = (student*)malloc(size * sizeof(student));
.
您没有为您的name
字段分配足够的内存。
length = strlen(YourName); (Arr + i)->name = (char*)malloc(length * sizeof(char));
应该是length = strlen(YourName)+1;
持有null
字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句