Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 重写二维数组时内存泄漏_C_Pointers_Memory Leaks_Malloc_Dynamic Memory Allocation - Fatal编程技术网

C 重写二维数组时内存泄漏

C 重写二维数组时内存泄漏,c,pointers,memory-leaks,malloc,dynamic-memory-allocation,C,Pointers,Memory Leaks,Malloc,Dynamic Memory Allocation,我想调用一个函数,该函数使用我的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 *)mal

我想调用一个函数,该函数使用我的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;
}
#包括
#包括
整数**更大(整数**A)
{
int i;
int**A2=(int**)malloc(10*sizeof(int*);
对于(i=0;i<10;i++)
A2[i]=(int*)malloc(10*sizeof(int));
返回A2;
}
内部主(空)
{
int i;
int**A=(int**)malloc(5*sizeof(int*);
对于(i=0;i<5;i++)
A[i]=(int*)malloc(5*sizeof(int));
A=更大(A);
对于(i=0;i<10;i++)
自由(A[i]);
免费(A);
返回0;
}

如果我用
valgrind--leak check=yes
检查它,我会得到堆的总使用量:6个alloc,3个frees,240个字节分配。如何解决此内存泄漏问题?

TL:DR,您不是在写,而是在覆盖

问题在于

 A = bigger(A);
biger()
函数中,您正在分配新的内存,然后将其存储回
A
,这会使您丢失指向以前分配的内存的指针,从而使它们无法访问并且不是
空闲的()
-d。这些导致了这里的泄漏

您需要使用来调整已
malloc()
ed内存区域的大小


否则,在再次调用
malloc()
之前,在
biger()
内部,您应该
释放可用内存。

TL:DR,您不是在写,而是在覆盖

问题在于

 A = bigger(A);
biger()
函数中,您正在分配新的内存,然后将其存储回
A
,这会使您丢失指向以前分配的内存的指针,从而使它们无法访问并且不是
空闲的()
-d。这些导致了这里的泄漏

您需要使用来调整已
malloc()
ed内存区域的大小


否则,在再次调用
malloc()
之前,在
biger()
中,您应该
释放可用内存。

但是如果我的函数中需要另一个原始数组的副本,比如A和A2,我该如何解决这个问题,我执行任务,然后返回A2?但是如果我在函数中需要原始数组的另一个副本,比如A和A2,我执行任务,然后返回A2,我该如何解决这个问题?