2015-06-04 71 views
2

我正在寫這個C程序有一個奇怪的問題,通過目錄循環並打開每個文件來做一些工作。我的程序位於我正在搜索的目錄的父目錄中。爲了讓fopen能夠看到那個目錄中的文件,我在我的while((dp = readdir(dfd))!= NULL)調用之前正在進行chdir(path)調用。第一個文件得到很好的拾取,但我在這次調用中獲得了下一次迭代的段錯誤。這似乎是與chdir和readdir邏輯的問題,我不知道如何解決它。有任何想法嗎?這裏是我的代碼:C在chdir之後的readdir中的segfault

if((dfd = opendir(dir)) == NULL){ 
    fprintf(stderr, "Can't open %s\n", dir); 
    return 0; 
} 
chdir(dir); 

char *filename; 
//loop through the directory 
while((dp = readdir(dfd)) != NULL){ 
    printf("Searching file %s\n", dp->d_name); 
    filename = malloc(50); 
    filename = dp->d_name; 
    char text[80]; 
    int words = 0; 
    int cellular = 0, CDMA = 0, GSM = 0, LTE = 0, wireless = 0, realtime = 0, GPS = 0, remote = 0, monitor = 0; 
    struct stat stbuf; 

    //Skip any directories 
    if((stbuf.st_mode & S_IFMT) == S_IFDIR){ 
     printf("Directory skipped.\n"); 
     continue; 
    } 

    //Skip files that can't be opened 
    if((fpt=fopen(filename,"r")) == NULL){ 
     printf("Couldn't open file %s.\n", filename); 
     continue; 
    } 

    //search the file 
    while(fscanf(fpt, "%s", text) != EOF){ 
     words++; 
     //....etc 
+0

我已經通過gdb運行它,段錯誤發生在while((dp = readdir(dfd))!= NULL)的第二次迭代中。 – user3522016

+1

'filename = malloc(50); filename = dp-> d_name;'=兩行短內存泄漏。你剛纔扔掉了線上的內存'malloc''d。 – WhozCraig

+0

@ user3522016我的壞沒有讀過這個問題,我將刪除我的評論 – Spidey

回答

2

你最有可能破壞內存,導致後續調用readdir()作爲dfd結構中的數據被錯位失敗。你是做一些「壞」的東西在你的代碼:

  • filename=malloc()其次filename=... - 這將導致內存泄漏(但不是段錯誤)
  • fscanf(fpt,...) - 你的棧上分配80個字節,但然後你要求libc讀一個「單詞」。如果單詞超過80個字符,則會損壞堆棧中的任何內容。這很可能導致段錯誤。你可能有更多的代碼,我們沒有看到它做的那麼糟糕。
+0

是的,做到了,謝謝。是的,我知道文件名稱是愚蠢的,謝謝你的收穫。 – user3522016