簡體   English   中英

釋放二維char數組

[英]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.

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