Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-指向结构的指针的malloc_C_Pointers_Struct_Malloc - Fatal编程技术网

C-指向结构的指针的malloc

C-指向结构的指针的malloc,c,pointers,struct,malloc,C,Pointers,Struct,Malloc,我的代码可以工作,但我还没有弄清楚malloc是如何将内存分配给C中指向struct的指针的。在我的代码中,我没有将我的struct的整个大小分配给指针,而只分配了它的成员的大小,这是好还是坏?如果不好,我应该做什么来优化我的代码 这是我的密码: struct Student { char name[25]; float math, physic; char rank; }; void studentManagement(void) { struct Studen

我的代码可以工作,但我还没有弄清楚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++;
  }
}
struct学生
{
字符名[25];
数学、物理;
字符秩;
};
void学生管理(void)
{
结构学生;
int n,i=1;
浮动大道;
printf(“学生人数=”);
scanf(“%d”和“&n”);
getchar();
而(在南,25岁,标准日);
免费的;
s=malloc(5*sizeof(浮动));
printf(“物理等级=”);
scanf(“%f”和&s->physic);
printf(“数学成绩=”);
scanf(“%f”,&s->math);
getchar();
ave=((s->math)+(s->physic))/2;
如果(平均值为5&&;平均值为7&&;平均值为8)
printf(“秩=A\n”);
免费的;
i++;
}
}
s=malloc(25*sizeof(char)),您正在分配空间并将
s
设置为指向此空间
s
是指向
struct Student
的指针。所以
s
应该为
struct学生指出足够的空间。因此,适当的分配是:

s = malloc(sizeof(struct Student));
另一种方法是使用
s
指向的对象的大小:

s = malloc(sizeof *s);
后者通常是首选的,因为如果以后更改代码,使
s
指向不同类型的对象,则后者仍然正确

在得到名字后,你有
免费的。这是不正确的。只有在使用完内存后,才应释放内存。但是您仍然希望使用
s
指向的对象,因此现在释放
s
还为时过早

类似地,您不需要使用
s=malloc(5*sizeof(float))。语句
s=malloc(sizeof*s)
将(如果成功)为
struct学生的所有分配足够的内存。分配整个结构,使用它,然后释放它。您不分配结构的各个部分

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

in
s=malloc(25*sizeof(char)),您正在分配空间并将
s
设置为指向此空间
s
是指向
struct Student
的指针。所以
s
应该为
struct学生指出足够的空间。因此,适当的分配是:

s = malloc(sizeof(struct Student));
另一种方法是使用
s
指向的对象的大小:

s = malloc(sizeof *s);
后者通常是首选的,因为如果以后更改代码,使
s
指向不同类型的对象,则后者仍然正确

在得到名字后,你有
免费的。这是不正确的。只有在使用完内存后,才应释放内存。但是您仍然希望使用
s
指向的对象,因此现在释放
s
还为时过早

类似地,您不需要使用
s=malloc(5*sizeof(float))。语句
s=malloc(sizeof*s)
将(如果成功)为
struct学生的所有分配足够的内存。分配整个结构,使用它,然后释放它。您不分配结构的各个部分


一旦那段代码正常工作,您应该考虑一下为什么要为
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字节),而不是char name[25]在struct中,但我如何仍能将输入的名称保存到struct中的成员名称中?@ThuanNguyen:我认为你对
malloc
和指针有错误的想法。你不能使用
malloc
为结构的某些部分分配内存。你不应该只分配25个字节,在其中输入一个名称,并期望它仅仅是一个字节仅与
s
指向的结构关联。当您声明
struct Student*s;
时,还没有结构。
s
只是一个还没有值的指针。您需要使用
malloc(sizeof*s)为该结构分配内存
。然后需要设置
s
指向该内存,并使用
s=malloc(sizeof*s)
…一旦你这样做,
s
就指向结构,它包含
name
math
physic
、和
rank
。当你使用
s->name
时,你正在使用结构中的
name
成员。谢谢你的回复!我现在明白了。但是我分配了s=malloc(25*sizeof(char)作为名称,所以在使用它之后,我认为我应该释放它