2017-11-15 16 views
1

C言語のようなlsをコードする必要がありますが、いくつか問題があります。 opendirを使ってディレクトリを開いた後、printfやputsを使ってパス名を表示しないと、closedirで実行するとcore dumpedエラーが出ますが、パスを印刷するとコードはうまく動作します。opendirの後にパス名が表示されない場合、closedirを使用するとコアがダンプされる

const char * cwd="."; 
DIR * dir=opendir(cwd); 
//that print --> printf("%s",cwd); 
if(dir==NULL){ 
    puts("ohlala"); 
} 
char * filename; 
struct dirent * truc; 
struct stat * filestat=malloc(sizeof(struct stat *)); 
while((truc=readdir(dir))!=NULL){ 
    filename=truc->d_name; 
    if(strcmp(filename,"..")!=0 && strcmp(filename,".")!=0){ 
     if(l==0){ 
      printf("%-s ",filename); 
     }else if(l==1){ 
      if(stat(filename,filestat)!=0){ 
       printf("Erreur stat de %s\n",filename); 
       exit(1); 
      } 
      printf("%ld %-s ",filestat->st_ino,filename); 

     } 
    } 
} 
//gdb is telling me the probleme is here 
closedir(dir); 
return 0; 

ありがとう。あなたは正しくfilestatを割り当てていない

+2

をそのような奇妙な何かがどこか* *未定義の動作のTELLすることができます。 –

+0

脇に:変数 'l'(ell)は何ですか?とにかく 'int hell = l;'と言うと、それが '1'(1)でないことを慎重に見なければならないので、これは名前の非常に貧しい選択です。 –

+0

"。"を見ているので問題ではありませんが、 'dir'が' NULL'ならば、何かを出力してはいけません - 関数からも戻ります。 –

答えて

3

:この行

struct stat * filestat = malloc(sizeof(struct stat *)) 

はありませんアスタリスクで

struct stat * filestat = malloc(sizeof(struct stat)) 

でなければなりません。現在、statの呼び出しは、割り当てられたメモリブロックを超えて書き込みを行い、未定義の動作を引き起こします。あなたが動的にfilestatを割り当てる必要はありません

注:それはローカル変数の作成、および&filestatstatへの呼び出し渡す:

struct stat filestat; 
... 
if(stat(filename, &filestat) != 0) { 
    ... 
} 
... 
printf("%ld %-s ", filestat.st_ino, filename); 
+0

@DanKornはい、私はこの提案をするために編集中でした。ありがとう! – dasblinkenlight

関連する問題