无法释放动态分配的二维数组
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);
需要存在,因为指向 char 的初始指针数组是通过调用 malloc() 创建的。
考虑以下代码:
#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
:
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);
需要存在,因为指向 char 的初始指针数组是通过调用 malloc() 创建的。