2011-09-26 48 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

没问题,先生! –

相关问题