在递归函数内重新分配后,无法释放缓冲区的数据。可能是什么原因?

时间:2014-10-17 19:56:38

标签: c realloc

所以我遇到了一个问题 - 当我的数据超过我的缓冲区的初始大小并且我在递归函数中重新分配时,我得到一个错误来释放它的缓冲区。

  

* 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 个答案:

答案 0 :(得分:2)

来自@WhozCraig的评论指出了这个问题。这是一个建议的解决方法。

  1. realloc返回recPrint ed缓冲区。

  2. free的返回值使用recPrint

  3. 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);