GtkListStore添加(分段错误)

时间:2015-05-15 16:53:39

标签: c segmentation-fault gtk gtk3 glib

我正在尝试将GSList传递给GtkListStore以向用户显示。但是当我将值设置为GtkListStore时,它只会给我分段错误。我真的不知道问题出在哪里。 我测试了这个列表,所以它不是空的,它有gchar向量,正如预期的那样。

enum {
    COLUMN_FILENAME,
    NUM_COLUMNS
};

GtkBuilder *builder;

void add_to_source_list(gpointer filename, gpointer list_store) {
    GtkTreeIter iterator;
    gtk_list_store_append(GTK_LIST_STORE(list_store), &iterator);

    // When the program reaches this line it gives segmentation fault
    gtk_list_store_set_value(list_store, &iterator, COLUMN_FILENAME, filename);
}

void source_files_list_update() {
    GSList *list = file_manager_get_all_sources();

    GtkListStore *list_store;
    list_store = gtk_list_store_new(NUM_COLUMNS,
                                G_TYPE_STRING);

    GtkTreeView *tree_view;
    tree_view = GTK_TREE_VIEW(gtk_builder_get_object(builder, TREE_VIEW_ID));
    g_assert_true(tree_view != NULL);
    gtk_tree_view_set_model(tree_view, GTK_TREE_MODEL(list_store));

    GtkCellRenderer *renderer;
    renderer = gtk_cell_renderer_text_new();

    GtkTreeViewColumn *column;
    column = gtk_tree_view_column_new_with_attributes("FILENAME", renderer, "text", COLUMN_FILENAME, NULL);

    gtk_tree_view_append_column(tree_view, column);
    g_slist_foreach(list, add_to_source_list, list_store);
}

2 个答案:

答案 0 :(得分:2)

gtk_list_store_set_value()GValue作为其最后一个参数,而不是字符串。您通常会在这种情况下收到编译器警告,但在这种情况下,filename仍然是gpointer,这是void *,因此编译器假定您正在做正确的事情

修复程序的最简单方法是使用gtk_list_store_set()代替。阅读the documentation(并遵循jcoppens的建议,但我不确定在这种情况下是否会有所帮助......)。

答案 1 :(得分:0)

我建议你在gdb中运行代码。您没有说明您使用的是哪个IDE(如果有),但您可能需要使用-g -O0选项重新编译该程序以获取gcc:

gcc -g -O0 <old options>

-O0关闭任何优化,因此遵循代码更简单。-g包含调试信息。)

然后您可以在gdb中运行该程序,并在分段错误后,使用命令bt执行'回溯'。这将为您提供发生段错误的确切功能,并使您更容易查明问题。

我还尝试添加printf("%s\n", filename);,只是在您对段错误发表评论的位置。然后你可以看到发生段错误的时间(如果成功通过了)