2017-05-08 16 views
0

ディレクトリ内のファイルを読み込み、それらがELFタイプであるかどうかをチェックして、そのファイルの最初の10バイトを出力します。問題はfread(buffer,1,4,f1);行です。最初のwhileループではすべて正常に動作しますが、2回目の繰り返しでこのエラーがポップアップします: "segmentation fault(core dumped)"。この場合、なぜこのエラーが表示されるのか誰にも分かりますか?私はこの問題に関連した質問がたくさんある知っているが、私は答えセグメント化エラー(コアダンプされた)fread関数

while ((pDirent = readdir(pDir))!= NULL){ 
     void *dl; 
     dl = dlopen(pDirent->d_name, RTLD_LAZY | RTLD_LOCAL); 

     if(dl != NULL){ 
      printf("Failo vardas %s tai yra dinamine biblioteka \n",pDirent->d_name); 

     }else{ 
      char buffer[4]; 
      FILE *f1; 
      f1 = fopen(pDirent->d_name, "r");         
      fread(buffer,1,4,f1); 
      if(buffer[0] == 0x7f && buffer[1] == 'E' && buffer[2] == 'L' && buffer[3] =='F'){ 
      printf("%s sis failas nera dinamine biblioteka, tai yra ELF failas \n",pDirent->d_name);    
      } 
      fclose(f1); 
      FILE *f2; 
      f2 = fopen(pDirent->d_name, "r"); 
      char buf[10]; 
      fread(buf,1,10,f2); 
      printf("%s file 10 baitu : %s \n",pDirent->d_name,buf); 
      fclose(f2); 
     } 
     dlclose(dl); 

}

+3

'fopen'とfread'の戻り値を確認してください。 –

+0

pDirはどこから来ていますか?現在のディレクトリー以外のディレクトリーを見ている場合は、ディレクトリー名(およびスラッシュ)をファイル名の前に付けて開く必要があります。 –

+0

f1とf2がNULLでなく、エラーが消えていないか確認しなければなりませんでした。 –

答えて

5

bufは、NULLで終了ではありませんを見つけることができませんので、%sでそれを印刷すると、未定義の動作です。

+0

これは真実ですが、関連性は低いです。printf()はゼロを見つけるまでガベージを出力します。 – donjuedo

+0

動作は定義されていません。つまり、 'printf()' * shoud *が何もしないと仮定することはできません。 – willys

+0

OK、OP質問に答えるために、なぜsegフォールトが起こっていますか?あなたは "たぶんそれはprintf()だろう"と言っていますか? – donjuedo

関連する問題