我的代码可以工作,但是我还没有弄清楚malloc如何将内存分配给C中的struct指针。在我的代码中,我没有将struct的整个大小分配给我的指针,而只是分配了大小成员的好坏?如果不好,我应该怎么做才能优化我的代码。
这是我的代码:
struct Student
{
char name[25];
float math, physic;
char rank;
};
void studentManagement(void)
{
struct Student *s;
int n,i=1;
float ave;
printf("Number of student = ");
scanf("%d", &n);
getchar();
while(i<=n)
{
s = malloc(25*sizeof(char));
printf("Enter student name: ");
fgets(s->name,25,stdin);
free(s);
s = malloc(5*sizeof(float));
printf("Physics grade = ");
scanf("%f", &s->physic);
printf("Math grade = ");
scanf("%f", &s->math);
getchar();
ave = ((s->math )+ (s->physic)) / 2;
if(ave<5)
printf("Rank = D\n");
if(ave >= 5 && ave <= 7)
printf("Rank = C\n");
if(ave >= 7 && ave <= 8)
printf("Rank = B\n");
if(ave > 8)
printf("Rank = A\n");
free(s);
i++;
}
}
答案 0 :(得分:2)
在s = malloc(25*sizeof(char));
中,您正在分配空间并设置s
指向该空间。 s
是指向struct Student
的指针。因此,s
应该指向struct Student
的足够空间。因此,正确的分配是:
s = malloc(sizeof(struct Student));
另一种方法是使用s
所指事物的大小:
s = malloc(sizeof *s);
通常最好选择后者,因为如果以后更改代码以使s
指向不同类型的对象,则后者仍然正确。
在获得名称之后,您就拥有free(s);
。这是不正确的。仅在使用完内存后才释放它。但是您仍然想使用s
指向的对象,因此释放s
太早了。
类似地,您不需要使用s = malloc(5*sizeof(float));
。语句s = malloc(sizeof *s);
(如果成功)将为struct Student
的全部分配足够的内存。您分配一个完整的结构,使用它,然后释放它。您不分配结构的一部分。
一旦那段代码正常工作,您应该考虑为什么为struct Student
分配空间然后很快释放它。如果只想使用struct Student
进行一个循环迭代,则可以通过声明struct Student s;
而不是分配内存并指向它来实现。您正在处理的分配可能需要构建一个struct Student
数组,在这种情况下,您将不得不考虑如何为整个数组分配内存以及该数组中需要多少个元素。