2013-08-02 2 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 '은'malloc()'!!!의 반환 값을 캐스팅합니다. (http://stackoverflow.com/ 질문/605845/do-i-cast-the-malloc/605858 # 605858) ** –

답변

6

char로 char을 realloc하는 것은 성능 낭비입니다. 대신 적당한 크기의 청크로 작업하는 것이 좋습니다.

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

을하고 main에서 : 어쨌든, 포함한 FileContent에 대한 포인터를 전달

fileReader(fileName, &fileContent); 

을 너무 포인터에 업데이트 기능을 외부에서 볼 수있다.

+0

흥미 롭습니다 :'* '연산자를 사용하여 역 참조 대신'[0]'연산자를 사용하십시오. – alk

+0

성능 문제에 대한 보조 노트 : 고정 크기 청크로 할당을 늘리면 2 차 복잡성 O (n^2)가 발생하고 상수로 할당을 늘리면 _factor_는 선형 복잡성 O (n)을 부여합니다. 이것이 그러한 재 할당 계획의 대부분이 요인 접근법을 사용하는 이유입니다. – cmaster

+0

@perreal .. 함수 매개 변수에 사용 된 (char *)가이 스트리밍 케이스의 함수 외부에 표시되지 않는 이유를 알았지 만 stdin 스트리밍의 경우 작동합니까? – GSchimiti