簡體   English   中英

無法釋放動態分配的二維數組

[英]Failing freeing a 2d dimensional array dynamically allocated

考慮以下代碼:

#include <stdio.h>

char** baz_alloc(int size)
{
    char ** b = malloc((size+1) * sizeof(char*));
    for (int i = 0; i < size; i++)
        b[i] = "baz";
    b[size] = NULL;

    return b;
}

void baz_print(char** baz)
{
    char** b = baz;
    while (*b != NULL)
    {
        printf("%s\n", *b);
        b++;
    }
}

void baz_free(char** baz)
{       
    int len = 0;
    char** b = baz;
    for (; *b != NULL; len++, b++);

    for (int i = 0; i < len; i++)
        free(baz[i]);
    free(baz);
}

int main()
{
    char** baz = baz_alloc(10);
    baz_print(baz);
    baz_free(baz);

    getch();
    return 0;
}

調用free函數時,程序崩潰。 我在SO上看過類似的示例,看起來幾乎一樣。 我的代碼有什么問題?

謝謝。

您正在此指針上調用free()

b[i] = "baz"

該指針未分配malloc() (或calloc()realloc()等)。

你不能亂扔垃圾

free(baz[i]);

試圖擺脫

b[i] = "baz";

通常,只有:以相反的分配順序釋放分配的內容,分配的位置(在導致分配的最頂層函數中)。

例如 :

int main()
{
  char** baz = baz_alloc(10); //'creating' baz
  baz_print(baz); //using baz
  baz_free(baz); //freeing baz
  [...]
}

是很好的做法。

您的baz_free函數僅需使用1 free因為在baz_alloc僅調用了1個malloc

//Allocation
char ** b = malloc((size+1) * sizeof(char*));

//Freeing
free(b); // or in your function free(baz);

如果您的baz_alloc函數具有b[i] = malloc(...)您的baz_free代碼幾乎是正確的(您不需要重復兩次,可以在第一個循環中調用free(b) )。

這個循環:

for (int i = 0; i < len; i++)
    free(baz[i]);

應該不存在,因為從未分配過內存。

但是以下行:

free(baz);

需要到那里,因為通過調用malloc()創建了指向char的指針的初始數組。

暫無
暫無

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

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