我想调用一个使用我的2d动态数组的函数来创建另一个2d动态数组,然后重写我的第一个数组的值。所以代码是这样的:
#include <stdio.h>
#include <stdlib.h>
int **bigger(int **A)
{
int i;
int **A2 = (int **)malloc(10 * sizeof(int *));
for(i = 0; i < 10; i++)
A2[i] = (int *)malloc(10 * sizeof(int));
return A2;
}
int main(void)
{
int i;
int **A = (int **)malloc(5 * sizeof(int *));
for(i = 0; i < 5; i++)
A[i] = (int *)malloc(5 * sizeof(int));
A = bigger(A);
for(i = 0; i < 10; i++)
free(A[i]);
free(A);
return 0;
}
如果我用valgrind --leak-check=yes
检查它,我得到总堆使用量:6个allocs,3个frees,240个字节分配。我该如何解决这个内存泄漏?
答案 0 :(得分:4)
TL:DR ,您不是重写,而是覆盖。
问题在于
A = bigger(A);
在bigger()
函数内部,你正在分配新的内存,然后将它们存回A
,这会让你失去指向以前分配的内存的指针,从而使它们无法访问< / em>并且不是free()
- d。那些导致泄漏。
您需要使用realloc()
来调整已malloc()
内存区域的大小。
否则,在再次致电malloc()
之前,在bigger()
内,您应该free()
可用的回忆。