簡體   English   中英

C語言中的內存管理錯誤。 為什么會出現這些錯誤?

[英]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;
}

我確實收到一條警告,說它在編譯時返回了局部變量的地址,但是該錯誤與內存分配有何關系?

classgetClassInfo()函數中的局部變量,這意味着當該函數返回時,它不再存在。 return class; 語句返回一個指針,該指針在調用者收到該指針時不再有效。

您應該將class聲明為student*並使用malloc()動態分配它,就像您為學生自己所做的那樣。 那會在堆上分配它,因此它繼續存在,直到您顯式free()它。 您將需要執行malloc(sizeof(student) * CLASS_SIZE)為所有學生結構分配連續的空間。

沒錯,不釋放循環中分配的student結構是一個錯誤(特別是內存泄漏)。 實際上,您根本不需要動態分配學生。 您可以將學生人數和成績存儲在class[i].studentNrclass[i].grade

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM