좋아요, 문자열에서 파일의 텍스트를 저장하려고합니다. 메모리가 올바르게 재 할당되지 않은 것을 알기 전까지 모든 것이 정상적으로 작동하고 있었으며 작동하지 않아야합니다.고정 된 숫자 뒤에이 동적 문자열 생성이 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
문자를 할당
'fgetc()'이'int'를 반환하는 이유가 있습니다. 따라서 잘못 사용하고 있습니다. 또한,'sizeof()'! ='strlen()'. – EOF
@ user3121023 좋아,하지만 캐스트를 제거하십시오. –
@ EOF 이유가 무엇입니까? 그래, 난 sizeof 및 strlen 같은, 왜 첫 번째 함수가 잘못되지 않습니다 알고 ... 왜 그것이 작동하는지에 대한 아이디어? – dieortin