2012-05-09 2 views
4

코드에서 필자는 자유롭게해야 할 2 차원 배열을 할당합니다.C - 포인터에 포인터 놓기

그래서 사람이 어떻게이 상황?

처리하는 말해 줄 수) 그러나, 내가 포인터의 개념을 파악했다고 생각 때마다, 그들은 내가 그들을 기대하고 있지 나를 놀라게 유지 이것은 내가 내 포인터에 메모리를 할당하는 방법입니다

typedef struct HRTF_ { 
    kiss_fft_cpx freqDataL[NFREQ] 
    kiss_fft_cpx freqDataR[NFREQ] 
    int nrSamples; 
    char* fname; 
} HRTF; 

HRTF **_pHRTFs = NUL; 
int _nHRTFs = 512; 

_pHRTFs = (HRTF**) malloc(sizeof(HRTF*) *_nHRTFs); 

int i = _nHRTFs; 
while(i > 0) 
    _pHRTFs[--i] = (HRTF*) malloc(sizeof(HRTF)); 

// Load data into HRTF struct 

을 그리고 여기 내가 사용하는 메모리 확보해야한다고 생각하는 방법은 다음과 같습니다개인을 자유롭게

if(_pHRTFs != NULL) 
{ 
    __DEBUG("Free mem used for HRTFs"); 
    for(i = 0; i < _nHRTFs; ++i) 
    { 
    if(_pHRTFs[i] != NULL) 
    { 
     char buf[64]; 
     sprintf(buf, "Freeing mem for HRTF #%d", i); 
     __DEBUG(buf); 
     free(_pHRTFs[i]); 
    } 
    } 
    __DEBUG("Free array containing HRTFs"); 
    free(_pHRTFs); 
} 

을님의 작품에 마지막으로 __DEBUG 문장이 인쇄되었지만 마지막으로 free(_pHRTFs)이 나에게 세그먼트 오류를 ​​제공합니다. 왜?

Nevermind - 마지막으로 free(_pHRTFs) 뒤에 디버그 문을 추가하면이 코드가 실제로 작동하고 내 문제가 다른 곳에서 발견 된 것으로 나타났습니다. 시간 내 주셔서 감사합니다!

조나스

+3

코드는 정상적으로 보입니다. 당신은 실제로 할당과 자유 사이의 모든 것을 논평 할 수 있고 그것이 아직도 일어나고 있는지 볼 수 있습니까? – cnicutar

+0

char * fname은 어떻게 사용됩니까? 만약 당신이 그것을위한 메모리를 할당한다면, 구조체를 가지고있는 배열을 해제하기 전에 그것을 풀어 놓아야한다. –

+0

코드가 괜찮아 보입니다. malloc의 결과를 C 코드로 캐스팅하지 마십시오. 컴파일러 경고를 통해 다르게 나타날 수있는 오류를 마스크하지 않아도됩니다. –

답변

2

코드는 괜찮습니다. 나는 그것을 실행하려고 시도하고 그것은 잘 작동합니다. 아래 코드는 내가 테스트 한 코드이며 (알 수없는 데이터 타입을 int로 대체했다.) 여기에 아무 것도 없다는 것을 보여주는 출력이있다. 오류는 다른 이유로 인해 발생합니다.

#include <stdio.h> 
#include <stdlib.h> 

typedef struct HRTF_ { 
     int freqDataL[10]; 
     int freqDataR[10]; 
     int nrSamples; 
     char* fname; 
} HRTF; 

HRTF **_pHRTFs = NULL; 
int _nHRTFs = 512; 

int main(){ 
    printf("allocatingi\n"); 
    _pHRTFs = (HRTF**) malloc(sizeof(HRTF*) *_nHRTFs); 

    int i = _nHRTFs; 
    while(i > 0) 
      _pHRTFs[--i] = (HRTF*) malloc(sizeof(HRTF)); 

    printf("Allocation complete. Now deallocating\n"); 
    for(i = 0; i < _nHRTFs; ++i) 
    { 
     if(_pHRTFs[i] != NULL) 
     { 
      char buf[64]; 
      sprintf(buf, "Freeing mem for HRTF #%d", i); 
      //__DEBUG(buf); 
      free(_pHRTFs[i]); 
     } 
    } 
    printf("complete without error\n"); 
    return 0; 
} 

그리고 출력 :

[email protected]:desktop$ ./a.out 
allocatingi 
Allocation complete. Now deallocating 
complete without error 
1

메모리 할당 및 해제 잘 보인다. 나도 타입을 int로 변경 한 후 위의 코드를 컴파일했고 아래 출력을 얻었다. 문제는 다른 곳에 있습니다.

Freeing mem for HRTF #0 
Freeing mem for HRTF #1 
...... 
Freeing mem for HRTF #509 
Freeing mem for HRTF #510 
Freeing mem for HRTF #511 
+0

답변을 편집하고 출력을 줄일 수 있는지 확인하십시오. – tuxuday

+0

올바른 무료()를 정당화하기 위해이 경우 완전한 출력을 원했습니다. 심지어 나는 긴 게시물을 쓰려고하지 않습니다. –

관련 문제