2016-12-06 1 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); 

そして、これらは、プログラムが印刷エラー前の最後の行です:前のコードが働いており、これは「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文字を割り当てる

+3

なぜ 'fgetc()'が 'int'を返すのか*理由*があります。あなたはこのように間違って使用しています。また、 'sizeof()'!= 'strlen()'です。 – EOF

+0

@ user3121023 [OK]を、キャストを削除します。 –

+0

@EOF何が理由ですか?うん、私はsizeofとstrlenが同じではない、なぜ最初の関数が間違っているのか知っています...なぜそれが動作するかについての任意のアイデア? – dieortin

答えて

2

を、その後、未定義の動作となるquijote[writingAt + 1]にアクセスする - それは(writingAt + 2)番目のですこれは実際に割り当てられた文字数の1倍です。

関連する問題