그래서 문제가 생겼습니다 - 버퍼의 초기 크기를 초과하는 데이터가 있고 재귀 함수 내에서 재 할당 할 때 버퍼를 비우는 중 오류가 발생합니다.버퍼가 재귀 함수 내에서 재 할당 된 후 버퍼의 데이터를 해제 할 수 없습니다. 그 이유는 무엇일까요?
는 코드 * 할당되지 않은 해제되는 : 이*의 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
}
}
}
Ла-ла-ла-ла-ла-ла-ла-ла :-) – dasblinkenlight
@dasblinkenlight는) – YohanRoth
원래 포인터 값은 장기이며 'realloc' 이후에 사라졌습니다. 포인터의 호출자의 값은 변경되지 않고'realloc'이 수행되는 즉시 유효하지 않습니다 (재귀 호출 체인 전체에서 ** by-value **가 전달됨을 참고하십시오). – WhozCraig