[英]Freeing a 2-d char array
使用此函數分配二維數組后:
char** make_matrix(int M, int N)
{
char** MAT = (char**)malloc(M * sizeof(char));
for (int i = 0; i < M; i++)
{
MAT[i] = (char*)malloc(N * sizeof(char));
}
return MAT;
}
我發現嘗試free(M[0])
會導致斷言失敗。 我發現與釋放二維數組有關的所有內容都使用int
而不是char
。 但是,將每個char
替換為上面的int
,斷言失敗就消失了。 為什么會這樣,然后如何釋放整個二維數組?
您為MAT
分配的內存太少。 將相關行更改為:
char** MAT = (char**)malloc(M * sizeof(char*));
這是因為MAT是指針數組,而不是字符。 由於您的代碼沒有分配足夠的內存,因此可能是在數組范圍之外寫入並破壞了內存。
它可以與整數一起使用,因為它們更大,因此如果運氣好的話,您可能只分配了足夠的內存(至少在32位計算機上)。
第一個malloc調用是M * sizeof(char)而不是sizeof(char *)。 sizeof(char)為1字節,char *的大小可能為4字節。
編輯:我看到有人擊敗了我。 接受對方的回答。
您應該遍歷矩陣的所有行並先釋放它們,然后釋放MAT
像這樣的東西:
void free_matrix(int M)
{
for (in i = 0; i < M; i++)
{
free(MAT[i]);
}
free(MAT);
}
要釋放空間(假設已正確分配空間),您需要對free()
進行調用,該調用對應於對malloc()
每次調用。
void destroy_matrix(char **MAT, int M)
{
for (int i = 0; i < M; i++)
free(MAT[i]);
free(MAT);
}
當您用int
替換char
時,您的代碼可以正常工作,因為(32位)系統上的sizeof(int) == sizeof(int *)
。 很大程度上是巧合; 您將在64位系統上再次遇到麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.