C - 指向结构的指针的 malloc



我的代码可以工作,但我还没有弄清楚 malloc 如何将内存分配给指向 C 中结构的指针。在我的代码中,我没有将结构的整个大小分配给指针,而只分配了其成员的大小,这是好是坏?如果它不好,我应该怎么做来优化我的代码。

这是我的代码:

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 = Dn");
if(ave >= 5 && ave <= 7) 
printf("Rank = Cn");
if(ave >= 7 && ave <= 8) 
printf("Rank = Bn");
if(ave > 8) 
printf("Rank = An");
free(s);
i++;
}
}

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数组,在这种情况下,您必须考虑如何为整个数组分配内存以及数组中需要多少元素。

相关内容

  • 没有找到相关文章