2014-10-17 3 views
2

그래서 문제가 생겼습니다 - 버퍼의 초기 크기를 초과하는 데이터가 있고 재귀 함수 내에서 재 할당 할 때 버퍼를 비우는 중 오류가 발생합니다.버퍼가 재귀 함수 내에서 재 할당 된 후 버퍼의 데이터를 해제 할 수 없습니다. 그 이유는 무엇일까요?

*의 malloc : 객체 0x100106da0에 대한 *** 오류 : 포인터가 여기에

는 코드 * 할당되지 않은 해제되는 :

void recPrint(FILE *file, char *buffer, int realBufferSize, int bufferSize, char *freeCh, NodePtr* temp){ 

    //some code here... 

    int *intArr = temp -> usedIndices; 
    int i = 0; 
    for(i = 0; i < 36; i++){ 
     if(intArr[i] == 1){ 
      if(i > 9){ 
       *freeCh = i - 10 + 'a' ; 
      }else{ 
       *freeCh = i + '0'; 
      } 
      realBufferSize++; 
      if (realBufferSize >= bufferSize){ 
       buffer = realloc(buffer, (bufferSize + 100) * sizeof(char)); // <<--- REALLOC here 
       bufferSize += 100; 
      } 
      freeCh++; 
      recPrint(file, buffer, realBufferSize, bufferSize, freeCh, &temp -> children[i]); 

      //now we need to remove all extra characters till the next turn 
      freeCh--; 
      *freeCh = '\0'; 
     } 
    } 

} 

void printTrie(FILE *file, char *initialPath){ 

    initPath = initialPath; 
    if(root.isParent == 0) return; 
    char *buffer; 
    char *freeCh; 
    int *intArr = root.usedIndices; 
    int bufferSize = 10; 
    int realBufferSize = 1000; 

    int i = 0; 

    for(i = 0; i < 36; i++){ 
     buffer = calloc(1001, sizeof(char)); 
     freeCh = buffer; 

     if(intArr[i] == 1){ 
      if(i > 9){ 
       *freeCh = i - 10 + 'a' ; 
      }else{ 
       *freeCh = i + '0'; 
      } 

     freeCh++; 
     realBufferSize++; 
     recPrint(file, buffer, realBufferSize, bufferSize, freeCh, &root.children[i]); 
     free(buffer); //<<--- getting error here 
     } 
    } 
} 
+1

Ла-ла-ла-ла-ла-ла-ла-ла :-) – dasblinkenlight

+0

@dasblinkenlight는) – YohanRoth

+1

원래 포인터 값은 장기이며 'realloc' 이후에 사라졌습니다. 포인터의 호출자의 값은 변경되지 않고'realloc'이 수행되는 즉시 유효하지 않습니다 (재귀 호출 체인 전체에서 ** by-value **가 전달됨을 참고하십시오). – WhozCraig

답변

2

@WhozCraig에서 댓글이 밖으로 가리키는 문제. 여기에 제안 된 해결 방법이 있습니다.

  1. recPrint에서 realloc ED 버퍼를 리턴

    .

  2. freerecPrint의 반환 값으로 사용하십시오. printTrie에서

char* recPrint(FILE *file, char *buffer, int realBufferSize, 
       int bufferSize, char *freeCh, NodePtr* temp){ 

    .... 

    // where you recurse... 
    buffer = recPrint(file, buffer, realBufferSize, 
        bufferSize, freeCh, &temp -> children[i]); 

    // and always return the *current* buffer pointer back to the caller. 
    return buffer; 
} 

:

buffer = recPrint(file, buffer, realBufferSize, bufferSize, freeCh, &root.children[i]); 
    free(buffer); 
+0

흠 ... + 하지만 여전히 같은 오류가 있습니다 ... – YohanRoth

+0

어느 쪽이든 정말 나를 위해 작동합니다. 내가 다시 할당 된 버퍼를 반환하면 같은 오류가 발생합니다 ... 아마도 재귀와 관련이 없습니다. 포인터를 포인터로 연결하면 recPrint 내부에서 realloc을 수행 할 수 없으며 비슷한 오류 – YohanRoth

+0

@PutinHuylo 필요한 특수 소스를 포함했는지 확실하지 않습니다. 재귀 호출에서는 크기가 조정 된 버퍼 포인터 반환 결과 *를 보유해야합니다. 위의 게시 된 답변의 부록을 참조하십시오. – WhozCraig