2013-10-22 2 views
0

그래서 내가 만들어 다음과 같은 기능을 사용하여 이중 포인터에 대한 메모리를 할당 한 :무료 이중 포인터

void mallocDoubleArr(double ***arr, int size) 
{ 
    printf("Here: %d", size); 
    int i, j; 

    *arr = malloc(size * sizeof(double*)); 

    for(i = 0; i < size; i++) 
    { 
     (*arr)[i]= malloc(size*sizeof(double)); 
     for (j = 0; j < size; j++) 
     { 
      (*arr)[i][j] = 0; 
     } 
    } 
} 

을 내가 사용하는 함수를 호출 :

double **G; //Create double pointer to hold 2d matrix 

    mallocDoubleArr(&G, numNodes); 

이제 내 질문은 메모리를 확보하는 함수를 어떻게 작성합니까?

void freeDoubleArr(double ***arr, int size) 
{ 
    int i, j; 

    for (i = 0; i < size; i++) 
     for (j = 0; j < size; j++) 
      free((arr)[i]); 
    free(arr); 
} 
+0

아니요,'free (arr [i] [j])'는'double '값을'free'하려고 잘못했습니다. –

+0

@BasileStarynkevitch 당신이 무엇을 말하려고하는지 잘 모르겠습니다. 제 방법이 잘못되면 어떻게해야하는지 알려주세요. – Ace

+0

임시 변수를 사용하는 대신 ar에 즉시 저장하여 라이브를 두 번 많이 만듭니다. 사실, malloc이 void *를 반환하고 void ** 매개 변수를 취하지 않는 것처럼 double **을 반환하는 함수를 작성하는 것이 훨씬 쉽습니다. 그리고 free()가 void *를 취하는 것처럼, freeDoubleArr은 double ** 매개 변수를 취해야하며 포인터의 주소가 아니라 포인터를 전달해야합니다. – gnasher729

답변

3

당신에 대한 포인터의 주소를 전달하려는 것 같다 당신의 freeDoubleArr (I 오히려 deleteDoubleArr를 호출 할 것이다) freeDoubleArr(&G, numnodes) 같은 :

나는 이런 식으로 뭔가를 시도했다. 그럼 당신은 당신이 그러나 단지 일반 배열로, 당신의 정방 행렬이 배열에 대한 포인터의 배열로 표현되지 않는다는 것을 결정할 수있다, 그러나

void freeDoubleArr(double ***arrptr, int size) 
{ 
    double** arr = *arrptr; 
    for (int i = 0; i < size; i++) 
     free(arr[i]); 
    free (arr); 
    *arrptr = NULL; 
} 

이 필요합니다. 아마도 arrsize*size 요소들의 어레이가 (각각 double 인) 정말로 그 협약에 유용 할 수

struct matrix_st { 
    unsigned size; 
    double arr[]; /* flexible array of size*size elements */ 
}; 

같이 flexible array members (C99의 이상)을 사용.

그러면 빠른 액세스 및 뮤 테이터 인라인 기능을 정의 할 수 있습니다.

inline double get_element(struct matrix_st *m, int i, int j) { 
    assert (m != NULL); 
    unsigned s = m->size; 
    assert (i>=0 && i<s && j>=0 && j<s); 
    return m->arr[s*i+j]; 
} 

inline void put_element(struct matrix_st* m, int i, int j, double x) { 
    assert (m != NULL); 
    unsigned s = m->size; 
    assert (i>=0 && i<s && j>=0 && j<s); 
    m->arr[i*s+j] = x; 
} 

최적화하고 <assert.h>와 (assert(3)을 ... 참조) -DNDEBUG 컴파일 위의 접근 get_element와 뮤 테이터 put_element 더 빨리 코드보다 아마 될 것입니다.

매트릭스 생성은 (제로 혼성 매트릭스를 생성하는)이다

struct matrix_st* make_matrix (unsigned size) { 
    struct matrix_st* m = malloc(sizeof (struct matrix_st) 
           + size*size*sizeof(double); 
    if (!m) { perror("malloc"); exit(EXIT_FAILURE); }; 
    m->size = size; 
    memset(m->arr, 0, sizeof(double)*size*size); 
    return m; 
} 

그런 다음, 사용자는 단지 이러한 행렬을 확보 free 한 단일 호출을 사용할 수있다.

Linux에서 코딩하는 경우 gcc -Wall -g으로 컴파일하고 valgrind 메모리 누수 감지기와 gdb 디버거를 사용하십시오.

+0

프로그램은 내가 해본대로 시도하면 멈 춥니 다. 어쨌든 특별히 두 번 포인터를 사용해야하지만 코드에는 고맙습니다. 나는 나중에 다른 것을 조금 시도 할 것이다. – Ace

+0

나는'freeDoubleArr'에 포인터의 주소를 전달하고 싶지 않았기 때문에 제 대답을 향상 시켰습니다. 도움을 받으려면 –

+0

고맙습니다. 내가 지금 어떻게했는지에 대한 답을 올렸습니다. 그게 제대로 작동할까요? 프로그램은 정상적으로 컴파일되지만 모든 것을 적절하게 해제했는지 결코 알 수 없습니다. – Ace

1

는 무료 코드는 더처럼 안 다음 : 당신은 심지어를 무료로 시도를 일으킬 것입니다 루프에 대한 내부 그래서 어디서든 'J'매개 변수를 사용하지 않는

void freeDoubleArr(double ***arr, int size) 
{ 
    int i; 

    for (i = 0; i < size; i++) 
     free((*arr)[i]); 
    free(*arr); 
} 

같은 크기의 메모리 영역. malloc의 결과에 할당 할 때와 같은 방법으로, malloc의 포인터에 도달하기 위해 전달 된 포인터를 역 참조 할 필요가 있습니다.

또한 뭔가 특정 오류가 표시되거나 제대로 작동하지 않는다고 생각하는 경우 작동하지 않는 경우 유용합니다.

+0

나는 그것을 시험해 보았다. It doesnt는 어떤 에러도주지 만, "프로젝트가 작동을 멈췄다"고 말하면서 멈춘다. – Ace

+1

당신은 디버그 모드에서 항상 이런 종류의 것을 시도해야한다. 이것은 더 유용한 에러를 줄 것이다. "프로젝트가 작동을 멈췄습니다"라는 말은 창문을 통해 무언가를 실패하게 만들었습니다. 그 이유는 segfault 또는 무언가 때문일 가능성이 큽니다. 원본 코드에서 기대했던 것입니다. 디버거에서 코드를 실행하면 segfault가 발생하는 행을 정확하게 알려야합니다. –

관련 문제