1
 16     char* input = (char*) argv[1];
 17     FILE *fp = fopen (input, "r");
 18     if( fp == NULL)
 19     {
 20         printf(" reading input file failed");
 21         return 0;
 22     }
 23     fseek(fp,0,SEEK_END);
 24     int file_size = ftell(fp);
 29     rewind(fp);
 30     int i;
 31     int totalRun;
 32     char * temp;
 33     char* model;
 34     char* example;
 36     fscanf(fp,"%d",&totalRun);
 37     fscanf(fp,"%s",model);

上記は私のコードで、37行目でこのエラーが発生します "fscanf(fp,"%s".model)"

プログラムは信号 EXC_BAD_ACCESS を受信しました。メモリにアクセスできませんでした。理由: __svfscanf_l () のアドレス: 0x00007fff5fc00730 0x00007fff8db20bcb で KERN_PROTECTION_FAILURE

何が原因でしょうか?? gdb で *fp を調べました。totalRun _offset = 0 を読み取る前と _offset = 4096 を読み取った後。 totalRun の内容は正しかった ("3")。1 行しか読んでいないのに、なぜオフセットが 4096 なのですか? また、FILEで参照されている_blksizeとは何ですか。

ありがとうございました

4

2 に答える 2

2

にメモリを割り当てる必要がありmodelます。これは初期化されていないポインタです。また、fscanf()が に割り当てられた配列を超えて読み取らないようにしmodelます。model動的に割り当てる必要がない場合は、ローカル配列を使用してください。例えば:

char model[1024];
if (1 == fscanf(fp, "%1023s", model))
{
}

成功した代入の数を返す の戻り値を常に確認してくださいfscanf()。そうしないと、 の呼び出しが失敗した場合に、プログラムは初期化されていない変数を処理しfscanf()ます。

于 2012-10-15T13:13:24.207 に答える
1

変数modelは初期化されていません。fscanf()メソッドで使用する前に、メモリを割り当てる必要があります。あなたは2つの方法で行うことができます:

  1. 静的に-char model[1024];
  2. 動的に-完了したら、char * model = (char*) malloc(1024);を使用してバッファの割り当てを解除することを忘れないでください。free()
于 2012-10-15T13:18:10.833 に答える