文字列のファイルからテキストを保存しようとしていますが、メモリが正しく再割り当てされていないことに気づくまで、すべてが正常に機能していました。固定文字列の後にこの動的文字列の作成で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);
そして、これらは、プログラムが印刷エラー前の最後の行です:前のコードが働いており、これは「doesnの理由
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、またはその特定の番号にエラーがスローされる理由を示します。また、私はこのようなサイズの1に再割り当てしようとしました:... quijote = (char *) realloc(quijote, 1);
と、それはまた働く何らかの理由であなたがwritingAt + 1
文字を割り当てる
なぜ 'fgetc()'が 'int'を返すのか*理由*があります。あなたはこのように間違って使用しています。また、 'sizeof()'!= 'strlen()'です。 – EOF
@ user3121023 [OK]を、キャストを削除します。 –
@EOF何が理由ですか?うん、私はsizeofとstrlenが同じではない、なぜ最初の関数が間違っているのか知っています...なぜそれが動作するかについての任意のアイデア? – dieortin