繁体   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