[英]Memory management errors in the C language. Why are these errors?
我試圖在此代碼片段中找到兩個與內存分配有關的錯誤。 在演講中說,第一個錯誤是返回課堂 ,第二個錯誤是沒有釋放內存。 我不明白為什么第一個是錯誤。 第二個我不確定,但是對為什么有了一個好主意。
對於第一個錯誤,class是一個學生數組,函數getClassInfo返回指向該數組的指針,對我來說似乎很好。
我想我理解為什么要釋放內存。 在for循環的每次迭代中,將通過malloc為thisStudent分配內存,然后將class [i]分配給thisStudent的值。 在每次迭代中,都會為該學生重新分配一個新的內存塊,但是最后一個永遠不會釋放。
關於第一個錯誤為何是錯誤的任何澄清將不勝感激! 謝謝-克里斯
#include <stdio.h>
#define CLASS_SIZE 500
typedef struct student {
int studentNr;
char grade;
} student;
student * getClassInfo(void){
int i;
student class[CLASS_SIZE];
for(i = 0; i < CLASS_SIZE; i++){
student * thisStudent = (student*) malloc(sizeof(student));
if(thisStudent == NULL) return(NULL);
scanf("%d %c", &(thisStudent->studentNr),&(thisStudent->grade));
class[i] = *thisStudent;
}
return class;
}
我確實收到一條警告,說它在編譯時返回了局部變量的地址,但是該錯誤與內存分配有何關系?
class
是getClassInfo()
函數中的局部變量,這意味着當該函數返回時,它不再存在。 return class;
語句返回一個指針,該指針在調用者收到該指針時不再有效。
您應該將class
聲明為student*
並使用malloc()
動態分配它,就像您為學生自己所做的那樣。 那會在堆上分配它,因此它繼續存在,直到您顯式free()
它。 您將需要執行malloc(sizeof(student) * CLASS_SIZE)
為所有學生結構分配連續的空間。
沒錯,不釋放循環中分配的student
結構是一個錯誤(特別是內存泄漏)。 實際上,您根本不需要動態分配學生。 您可以將學生人數和成績存儲在class[i].studentNr
和class[i].grade
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.