C - malloc 用于指向结构体的指针

标签 c pointers struct 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 = 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++;
  }
}

最佳答案

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 来实现,而不是分配内存并指向它。您正在处理的作业可能需要构建一个 struct Student 数组,在这种情况下,您必须考虑如何为整个数组分配内存以及数组中需要多少个元素。

关于C - malloc 用于指向结构体的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51009229/

相关文章:

c - 如何在字符串数组上使用二分查找

struct - 解构在函数参数中包含借用的结构

C程序为了在文件中找到给定的句子

C - 初始化结构成员 - 指针数组。第二个元素的值不正确

c - C 中的逻辑相等

c++ - 在函数中返回数组

c - C中链表的搜索函数

c# - 开放类型可以是结构吗?

c - 为什么“while(!feof(file))”总是错误的?

c - EXIF 数据类型解释