2013-08-02 70 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