[英]C - malloc for a pointer to struct
我的代碼可以工作,但是我還沒有弄清楚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++;
}
}
在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
數組,在這種情況下,您將不得不考慮如何為整個數組分配內存以及該數組中需要多少個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.