2013-08-02 77 views
-1

我在這個代碼與fileContent可變麻煩。我希望通過重新分配的FileReader所做的修改工作在我的主精細,但它不工作..指針引用改變

void fileReader(char *fileName, char *fileContent){ 
    FILE *inputFile = fopen(fileName, "r"); 

    int fileLength = 0; 
    int endFlag = fgetc(inputFile); 

    while(endFlag != EOF){ 
     fileContent = (char *) realloc (fileContent, (fileLength + 1) * sizeof(char)); 
     fileContent[fileLength] = endFlag; 
     endFlag = fgetc(inputFile); 

     fileLength++; 
    } 
} 

int main(int argc, char const *argv[]){ 
    char *fileName = (char *) malloc (sizeof(char)); 
    char *taskStack = (char *) malloc (sizeof(char)); 
    char *fileContent = NULL; 

    inputReader(fileName, taskStack); 
    fileReader(fileName, fileContent); 


    return 0; 
} 
+0

你打算做什麼,你期望輸出什麼? – mohit

+0

你不應該'p = realloc(p,...)'。如果'realloc'失敗了,你就失去了對'p'的引用,並且會泄漏內存。當然,你不檢查'realloc'是否成功... – jamesdlin

+0

** [Do * not * friggin'cast''malloc()'!!!]的返回值(http://stackoverflow.com/問題/ 605845/do-i-cast-the-result-of-malloc/605858#605858)** – 2013-08-02 06:31:58

回答

6

通過char重新分配字符會浪費性能,相反,您可以考慮使用合理大小的塊。無論如何,一個指針傳遞到fileContent:

void fileReader(char *fileName, char **fileContent){ 
    /* ... */ 
    fileContent[0] = (char *) realloc (fileContent[0], 
      (fileLength + 1) * sizeof(char)); 

,並在main

fileReader(fileName, &fileContent); 

,使得更新指針的函數外可見。

+0

有趣:使用'[0]'運算符而不是使用'*'運算符進行解引用。 – alk

+0

作爲關於性能問題的一個注意事項:通過固定大小的塊增加任何分配給出二次複雜度O(n^2),通過常數_factor_增加分配給出線性複雜度O(n)。這就是爲什麼大多數這樣的重新分配方案使用因子方法。 – cmaster

+0

@perreal ..你知道爲什麼函數參數中使用的(char *)在這個流處理函數的函數之外是不可見的,但是在stdin流的情況下它有效嗎? – GSchimiti