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