【问题标题】:C - malloc for a pointer to structC - malloc 用于指向结构的指针
【发布时间】:2018-12-03 04:31:16
【问题描述】:

我的代码可以工作,但我还没有弄清楚 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++;
  }
}

【问题讨论】:

    标签: c pointers struct malloc


    【解决方案1】:

    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 Studentall 分配足够的内存。您分配整个结构,使用它,然后释放它。您不分配结构的各个部分。

    一旦你让那段代码正常工作,你应该考虑一下为什么要为struct Student 分配空间,然后尽快释放它。如果您只想使用struct Student 进行一次循环迭代,您可以通过声明struct Student s; 而不是分配内存并指向它来实现。您正在处理的任务可能需要构建一个struct Student 的数组,在这种情况下,您必须考虑如何为整个数组分配内存以及数组中需要多少元素。

    【讨论】:

    • 但是我为名字分配了 s = malloc(25*sizeof(char),所以在使用它之后,我想我应该释放它,这样我就可以继续分配 s = malloc(5*sizeof( float)) 用于成绩。我仍然不明白的一件事是:当我有:s = malloc(25*sizeof(char) 时,指针指向 malloc 分配的内存(即 25 * sizeof( char) =25 bytes) 不是 struct 中的 char name[25],但是我怎样才能将输入的名称保存到 struct 中的成员名称中?
    • @ThuanNguyen:我认为您对malloc 以及指针可能有错误的想法。不要使用malloc 为结构的某些部分分配内存。您不应该仅仅分配 25 个字节,将名称放入其中,并期望它仅与 s 指向的结构相关联。当您声明struct Student *s; 时,还没有结构。 s 只是一个还没有值的指针。您需要使用malloc(sizeof *s) 为该结构分配内存。然后你需要设置s 指向那个内存,s = malloc(sizeof *s);....
    • ... 一旦你这样做了,s 将指向包含namemathphysicrank 的结构。当您使用s-&gt;name 时,您在结构内部使用name 成员。
    • 感谢您回复我!我现在明白了。
    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多