2016-12-02 42 views
0

我想調用一個函數,它使用我的二維動態數組創建另一個二維動態數組,然後重寫我的第一個數組的值。因此,代碼是這樣的:重寫二維數組時內存泄露

#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個字節。我怎樣才能解決這個內存泄漏?

+1

歡迎來到Stack Overflow! [請參閱此討論,爲什麼不在'C'中投射'malloc()'和family的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

回答

4

TL:DR,你不重寫,你覆蓋

的問題是在

A = bigger(A); 

bigger()功能,你分配新的記憶,然後,將其存儲回A,它讓你失去了指向先前分配的記憶,從而使他們無法到達而不是free()-d。這些會導致泄漏。

您需要使用realloc()來調整已存儲區域的大小。

否則,在再次撥打malloc()之前,在bigger()之內,您應該有free()的可用存儲空間。

+0

但是我如何解決問題,如果我需要在我的函數中原始數組的另一個副本,讓我們說A和A2,我做我的任務,然後我返回A2? –

+0

@MihaiPodaru我沒有得到你的問題,你能詳細說明一下嗎? –