2017-05-08 111 views
0

我想讀取目錄中的文件,檢查它們是否爲ELF類型並打印這些文件的第10個字節。問題出在fread(buffer,1,4,f1);一行。在第一次while循環迭代中一切正常,但在第二次迭代時會彈出這個錯誤:「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是不是空終止,因此與%s打印這是一個未定義的行爲。

+0

這似乎是真的,但不太可能相關,因爲'printf()'應該只是打印垃圾,直到找到零。 – donjuedo

+0

行爲是未定義的,這意味着我們不能假設'printf()'* shoud *可以做任何事情。 – willys

+0

好的,爲了回答OP的問題,爲什麼會發生seg故障?你是說「也許它是printf()」? – donjuedo