如何在C语言中释放二维数组?

32

我有以下代码:

int **ptr = (int **)malloc(sizeof(int*)*N); 
for(int i=0;i<N;i++) 
     ptr[i]=(int*)malloc(sizeof(int)*N));
我该如何使用free来释放指针ptr?我应该循环遍历ptr并释放ptr[i]还是只需要:
free(ptr) 

那么ptr指向的内存将被释放吗?


这不是关于免费的问题,而是我想谈论malloc。正如Srikanth所指出的那样,如果您检查malloc失败,这是很好的。请参考此资料:https://dev59.com/214c5IYBdhLWcg3w3dZ_ - user10719814
6个回答

28

与分配相反:

for(int i = 0; i < N; i++)
    free(ptr[i]);
free(ptr);

如果我尝试访问我已经释放的位置,会出现分段错误吗? - Varad Bhatnagar
2
@VaradBhatnagar:这实际上是未定义的行为。可能会导致分段错误 - 谁知道呢! - Donotalo
我认为你不需要这里的第三行。 - Mohamed Ibrahim
@MohamedIbrahim:不,这是必需的,因为ptr是通过malloc分配的:int **ptr = (int **)malloc(sizeof(int*)*N); - Donotalo

25
你需要循环遍历ptr[i],释放你遍历到的每个int*,就像你最初建议的那样。例如:
for (int i = 0; i < N; i++)
{
    int* currentIntPtr = ptr[i];
    free(currentIntPtr);
}

3
出于好奇,为什么不能只使用 free(ptr[i]) 循环处理呢? - Russbear
5
没事,可能我在这里过于努力地让我的代码易读了! - James Bedford
@JamesBedford - 抱歉之前没能在上一个标记你。 - Rakshit Kothari
@RakshitKothari - 我猜是在免费部分崩溃了?最明显的答案可能是你的N值大于由“ptr”引用的数组的大小。 - James Bedford
1
只是为了更清晰地阐述正在发生的事情。 如果对开发人员有兴趣,这也可能使设置断点并查看即将被释放的指针的值更容易。 - James Bedford
显示剩余2条评论

11

是的,您必须循环遍历 ptr 并释放每个 ptr[i]。为了避免内存泄漏,一般规则是:对于每个 malloc(),必须有一个相应的 free()


6

简单

while (N) free(ptr[--N]);
free(ptr);

帅气

#define FALSE 0
#define TRUE 1
typedef int BOOL;

void freev(void **ptr, int len, BOOL free_seg) {
    if (len < 0) while (*ptr) {free(*ptr); *ptr++ = NULL;}
    else while (len) {free(ptr[len]); ptr[len--] = NULL;}
    if (free_seg) free(ptr);
}

freev(ptr, N, TRUE); /* if known length */
freev(ptr, -1, TRUE); /* if NULL-terminated */
freev(ptr, -1, FALSE); /* to keep array */

贵族

GLib函数:

我发现没有GLib很难进行严肃的C编程。它引入了诸如动态字符串之类的东西,并为函数式编程奠定了基础。它应该成为标准C运行时库的一部分。这将给C带来新鲜空气。这将使C在2019年再次成为合理和有竞争力的语言。但是因为它不是,它会增加1 MB到您的应用程序中(无论是在DLL大小还是可执行文件大小上)。此外,Windows发行版由虐待狂维护。


1
for(int i=0;i<N;i++) free(ptr[i]);
free(ptr);

你没有检查分配内存的malloc失败。你应该总是检查。


0

void freeMatrix(int **matrix ,int row)
{
    for(int i=0;i<row;i++)
    {
        free(matrix[i]);
    }
    free(matrix);
}


欢迎来到stackoverflow。如果您解释提供的代码,您的答案可能会更有价值。 - JonathanBristow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接