繁体   English   中英

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

[英]How to free 2d array in C?

我有以下代码:

int **ptr = (int **)malloc(sizeof(int*)*N); 
for(int i=0;i<N;i++) 
     ptr[i]=(int*)malloc(sizeof(int)*N));

如何使用free释放ptr 我应该遍历ptr和 free ptr[i]还是应该这样做

free(ptr) 

ptr会被释放吗?

正如您首先建议的那样,您将不得不循环ptr[i] ,释放您遍历的每个int* 例如:

for (int i = 0; i < N; i++)
{
    int* currentIntPtr = ptr[i];
    free(currentIntPtr);
}

与分配正好相反:

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

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

简单的

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 发行版由虐待狂维护

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

您没有检查 malloc 分配失败。 你应该经常检查。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM