2016-12-06 2 views
0

좋아요, 문자열에서 파일의 텍스트를 저장하려고합니다. 메모리가 올바르게 재 할당되지 않은 것을 알기 전까지 모든 것이 정상적으로 작동하고 있었으며 작동하지 않아야합니다.고정 된 숫자 뒤에이 동적 문자열 생성이 exc_bad_access 오류를 발생시키는 이유는 무엇입니까?

이 그것을 수정하기 전에 내 main 기능입니다 :

FILE * file; 
char * quijote, thisChar; 
unsigned int writingAt = 0; 

file = fopen("quijote.txt", "r"); 
quijote = malloc(1); 

if (file != NULL) { 
    while (1) { 
     thisChar = (char)fgetc(file); 
     if (thisChar == EOF) { 
      break; 
     } else { 
      printf("strlen(quijote) = %lu; writingAt = %i\n", strlen(quijote), writingAt); 
      quijote = (char *) realloc(quijote, (sizeof(quijote) + 1)); 
      quijote[writingAt] = thisChar; 
      quijote[writingAt + 1] = '\0'; 
      writingAt++; 
     } 
    } 
} else { 
    perror("fopen"); 
} 
fclose(file); 

그것은 완벽하게 작동하고 올바르게 문자열에있는 파일을 모두 저장합니다. sizeof(quijote)은 항상 같은 값 (8)을 가지므로 이론적으로는 작동해서는 안되기 때문에 메모리 재 할당이 올바르지 않습니다.

이제 재 할당을 수정하면 WritingAt = 135167 일 때 EXC_BAD_ACCESS 오류가 발생합니다. 이것은 "수정"main 기능입니다 :

FILE * file; 
char * quijote, thisChar; 
unsigned int writingAt = 0; 

file = fopen("quijote.txt", "r"); 
quijote = malloc(1); 

if (file != NULL) { 
    while (1) { 
     thisChar = (char)fgetc(file); 
     if (thisChar == EOF) { 
      break; 
     } else { 
      printf("strlen(quijote) = %lu; writingAt = %i\n", strlen(quijote), writingAt); 
      quijote = (char *) realloc(quijote, (writingAt + 1)); 
      quijote[writingAt] = thisChar; 
      quijote[writingAt + 1] = '\0'; 
      writingAt++; 
     } 
    } 
} else { 
    perror("fopen"); 
} 
fclose(file); 

그리고이 프로그램의 인쇄 오류 전에 마지막 라인이다 : 앞의 코드는 일이이 '아무튼 왜

strlen(quijote) = 135162; writingAt = 135162 
strlen(quijote) = 135163; writingAt = 135163 
strlen(quijote) = 135164; writingAt = 135164 
strlen(quijote) = 135165; writingAt = 135165 
strlen(quijote) = 135166; writingAt = 135166 
strlen(quijote) = 135167; writingAt = 135167 
Exception: EXC_BAD_ACCESS (code=1, address=0x10fc20000) 

내가 이해가 안 돼요 t 또는 프로그램이 그 특정 숫자의 오류를 던지는 이유. 또한, 나는이 같은 크기 일에 재 할당 시도했다 : ... quijote = (char *) realloc(quijote, 1);과도 작동 어떤 이유로 당신은 writingAt + 1 문자를 할당

+3

'fgetc()'이'int'를 반환하는 이유가 있습니다. 따라서 잘못 사용하고 있습니다. 또한,'sizeof()'! ='strlen()'. – EOF

+0

@ user3121023 좋아,하지만 캐스트를 제거하십시오. –

+0

@ EOF 이유가 무엇입니까? 그래, 난 sizeof 및 strlen 같은, 왜 첫 번째 함수가 잘못되지 않습니다 알고 ... 왜 그것이 작동하는지에 대한 아이디어? – dieortin

답변

2

을, 다음 정의되지 않은 동작이다 quijote[writingAt + 1] 접근 - 그것은 (writingAt + 2) '제의 문자는 할당 된 실제 문자 수보다 하나 많은 문자입니다.