2011-09-26 95 views
1

當我運行以下函數時,我得到一個SIGSEGV。我無法弄清楚爲什麼... 任何人都可以幫忙嗎?把我指向正確的方向?我認爲它是掃描目錄層次結構中重複文件的較大程序的一部分。爲什麼我會用glib獲得SIGSEGV?

#include <stdio.h> 
#include <stdlib.h> 
#include <glib.h> 

int main (int argc , char *argv[]) { 
    GError *error = NULL; 
    const gchar* filename = NULL; 
    gchar *directory_path = "/tmp"; 
    GDir* dp = g_dir_open (directory_path, 0, &error); 
    if (error) { 
     g_warning("g_dir_open() failed: %s\n", error->message); 
     g_clear_error(&error); 
     return 1; 
     } 
    while ((filename = g_dir_read_name(dp))){ 
     filename = g_dir_read_name(dp); 
     gchar* path = g_build_filename (directory_path, filename, NULL); 
     printf("%s\n", filename); 
     g_free (path); 
    } 
    return 0; 
} 
+0

我對glib不熟悉,但'gchar * directory_path =「/ tmp」'聞。使其成爲常量。 – eran

+0

嘗試在valgrind(http://valgrind.org/)中運行它並查看它說的是什麼。 –

回答

2

也許擺脫第二filename = g_dir_read_name(dp);(第一線的環內)

當它的循環測試條件,它已經分配filename在目錄下一個條目。如果您從循環中再次運行該行,它將嘗試在最後一行之後再讀取一個條目。如果目錄中有奇數個文件,則filename可能在循環的上次執行中指向空值。

+1

謝謝!這解決了它!當我重構我的功能時,我忘了刪除聲明。 – jakschu

+0

沒問題,先生! –

相關問題