Итак, я столкнулся с проблемой: когда у меня есть данные, превышающие начальный размер моего буфера, и я делаю перераспределение внутри рекурсивной функции, я получаю сообщение об ошибке освобождения своего буфера.
*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
}
}
}
realloc
. Значение указанного указателя вызывающей стороны не изменяется и становится недействительным, как только выполняетсяrealloc
(обратите внимание, что оно передается по значению по всей этой рекурсивной цепочке вызовов). - person WhozCraig   schedule 18.10.2014rePrint
, чтобы всегда возвращать текущее значение указателя буфера, чтобы подтолкнуть значение обратно вверх по цепочке вызовов, когда рекурсия раскручивается. Либо будет работать. Ответ Р. Саху ниже демонстрирует последний из них и определенно работает. - person WhozCraig   schedule 18.10.2014