2016-01-14 63 views
0

我的代碼包含來自Patient**struct BeforeTriag。 這裏的結構和它的領域:C:如何釋放包含char *和ENUM(int)字段的struct **?

typedef struct{ 
char Id[ID_SIZE]; 
char Name[NAME_SIZE]; 
char LastName[NAME_SIZE]; 
char PhoneNum[PHONE_SIZE]; 
STATUS Status; 
char Address[ADDRESS_SIZE]; 
}Patient; 

這是我動初始化和配置:

Patient** BeforeTriag = NULL; 
int* BeforeTriagSize[1] = { 0 }; 

BeforeTriag = (Patient**)malloc(sizeof(Patient*)); 
if (!(BeforeTriag)) 
{ 
    printf("ERROR!Out of memory!"); 
    exit(1); 
} 

*BeforeTriag = (Patient*)malloc((PatientArraySize)* sizeof(Patient)); 
if (!(*BeforeTriag)){ 
    printf("ERROR!Out of memory!"); 
    exit(1); 
} 

在這裏,我特林釋放在結構數據中每個字段:

for (i = 0; i < (*BeforeTriagSize); i++){ 
    free((BeforeTriag)[i]->Id); 
    free((BeforeTriag)[i]->Name); 
    free((BeforeTriag)[i]->LastName); 
    free((BeforeTriag)[i]->Address); 
    free((BeforeTriag)[i]->PhoneNum); 
    } 

    free(BeforeTriag); 

當我調試它時,暗戀免費ID的第一行: free((BeforeTriag)[i]->Id);

我應該怎麼做才能正常釋放?

回答

2

BeforeTriag[i]中的單個字段不是自行動態分配的,因此您不能釋放它們。你需要釋放結構作爲一個整體,因爲這是被分配:

for (i = 0; i < (*BeforeTriagSize); i++){ 
    free(BeforeTriag[i]); 
} 
free(BeforeTriag); 
+0

它仍然在粉碎線:free(BeforeTriag [i]); 錯誤說:損壞的堆棧 –

+0

@daniel_a然後我們需要了解更多關於如何管理陣列的信息。具體而言,如何擴展數組並跟蹤大小,以及如何讀取/寫入數據。 – dbush

+0

好的,謝謝。我會盡力寫更多的細節。 –

1

你不必這樣做:

for (i = 0; i < (*BeforeTriagSize); i++){ 
free((BeforeTriag)[i]->Id); 
free((BeforeTriag)[i]->Name); 
free((BeforeTriag)[i]->LastName); 
free((BeforeTriag)[i]->Address); 
free((BeforeTriag)[i]->PhoneNum); 
} 

因爲他們沒有動態分配。 但你必須在循環內免費BeforeTriag[i]

for (i = 0; i < (*BeforeTriagSize); i++){ 
    free(BeforeTriag[i]); 
} 
free(BeforeTriag); 
0

雖然@dbush和@RolBrok已經指出正確的,有沒有必要釋放個人會員,還有在你的代碼中的另一個bug:

int* BeforeTriagSize[1] = { 0 };

此行initalizes一個INT * *爲零。我真的不知道爲什麼你希望此變量是一個數組,但不管怎麼說,申報正確的方法將是

int BeforeTriagSize[1] = { 0 };

(如果你只需要一個BeforeTriagSize價值,無論如何,只是聲明它作爲int)

編輯:
另一件事你應該仔細看到的是你要爲你的結構分配內存的方式: *BeforeTriag = (Patient*)malloc((PatientArraySize)* sizeof(Patient));
有了這個你總是寫相同的指針。所以當你爲第二個結構分配內存時,你會覆蓋第一個結構的位置,基本上導致內存泄漏。

考慮沿
BeforeTriag[BeforeTriagSize++] = (Patient*)malloc((PatientArraySize)* sizeof(Patient));

行這將確保你正在寫到您的每一次陣列在新崗位上的東西。 (假設你將BeforeTriagSize改爲int - 如果你需要把它作爲一個函數的指針來使用,只需使用地址操作符(&))

+0

我修正了它,但當我發送BeforeTriagSize作爲參數給函數我發送它與int *。只是我開始固定,但它仍然不工作:( –