2014-03-14 1 views
0

내 프로그램에서 .txt 파일의 텍스트를 수신합니다. 다음은 텍스트 행의 예는 다음과 같습니다realloc 문제 - "다음 크기가 유효하지 않음"

12X15의 DE3의 DS4는 dn9 g2,7 m5,9 m3,1 h2,2 나는 각각의 덩어리를 헤어 strtok를()를 사용하는 것을 시도하고있다

본문; 그런 다음 각 청크를 배열의 요소로 넣습니다. 문자열 배열입니다. 여기

지금까지 내 코드입니다 :

void parseFile(char ** argv) { 
    FILE *textFile; 
    char *string; 
    char **lineToken; 
    int i; 

    textFile = fopen(argv[1], "r"); 
    lineToken = malloc(sizeof(1)); 
    string = malloc(sizeof(MAX_CHAR)); 

    while(fgets(string, MAX_CHAR, textFile) != NULL) { /* Get first line of text */ 
     lineToken[0] = strtok(string, " "); /* Put first element in lineToken[0] */ 
     for(i = 1; i; i++) { 
      /* Realloc because total number of elements is unknown */ 
      lineToken = realloc(lineToken, i + 1); 

      /* Put new strtok'd string into lineToken[i] */ 
      lineToken[i] = strtok(NULL, " "); 
     } 

     for(i = 0; i; i++) { 
      move(i, 0); 
      printw("%s", lineToken[i]); 
      refresh(); 
     } 
    } 
    free(lineToken); 
    free(string); 
} /* End of function */ 

하지만이 realloc과 오류가 점점 계속 : 여기

lineToken = malloc(sizeof(1)); 

당신이 할당 :

*** glibc detected *** ./bin/a3RunMe: realloc(): invalid next size: 0x01f2a270 *** 
Aborted 
+0

확실히 'printw' 대신에'printf'를 사용했습니다. – ajay

+0

사과드립니다. 나는 ncurses 라이브러리를 사용하고 있으므로 화면에 텍스트를 인쇄하려면 printw가 필요하다. – Plaidypus

답변

3

이 가장 가능성이 문제를 정수 리터럴의 크기는 lineToken 이상이어야합니다. sizeof(*lineToken) (또는 sizeof(char *)) 바이트. 정수의 크기와 포인터의 크기는 64 비트 플랫폼 (특히 int은 4 바이트이고 포인터는 8 바이트)에서 동일하지 않을 수 있습니다.

그래서 당신은 당신이 (버퍼 오버 플로우) 할당 및 할당에 의해 거기에 넣어 데이터를 덮어 무슨 이상 쓰기

lineToken[0] = strtok(string, " ") 

을 수행 할 때.

바이트을 할당하는 realloc 호출에 문제가 있습니다. 따라서 심지어 32 비트 플랫폼 (int의 크기가 포인터의 크기와 같은 경우)을 사용하는 경우에도 루프의 첫 번째 반복에서 포인터가 4 바이트에서 2 바이트로 재 할당됩니다 . 이러한 루프와 같은 또한 다른 문제가


:

for(i = 1; i; i++) 

C에 '0'이 아닌 값에 해당하는 때, 그리고 i 이제까지 그 루프에서 0이됩니다 것을 기억 하는가? 이 for 루프는 무한

+0

좋아요, 그래서 루프의 반복을 수정했습니다. 나는 "string! = NULL"의 조건으로 충분하다고 생각한다. 이제, realloc 호출과 함께 ... 내가 거기에 넣을 것을 권하겠습니까? 내가 뭘하려고하는지 이해한다고 생각 하나? – Plaidypus

+0

@ user2359287'sizeof (char *) * (i + 1)'와 같이 sizeof (char *) 바이트의 배수를 할당한다는 것을 기억하십시오. –

+0

그렇게 많은 의미가 있습니다. 당신이 제안한 것을 추가하고 작동합니다!도와 주신 모든 분들께 감사드립니다. – Plaidypus

1

...

for(i = 1; i; i++) 
{ 
     lineToken = realloc(lineToken, i + 1); /* Realloc because total number of elements is unknown */ 
     lineToken[i] = strtok(NULL, " "); /* Put new strtok'd string into lineToken[i] */ 
} 

조건 i는 항상 i != 0에 대한 TRUE로 평가됩니다.

루프에서 계속 증가하고 할당 할 수 있으므로 오류가 발생할 수 있습니다.

관련 문제