所以我遇到了一个问题 - 当我的数据超过我的缓冲区的初始大小并且我在递归函数中重新分配时,我得到一个错误来释放它的缓冲区。
* 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
}
}
}
答案 0 :(得分:2)
来自@WhozCraig的评论指出了这个问题。这是一个建议的解决方法。
从realloc
返回recPrint
ed缓冲区。
对free
的返回值使用recPrint
。
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;
}
在printTrie
:
buffer = recPrint(file, buffer, realBufferSize, bufferSize, freeCh, &root.children[i]);
free(buffer);