C -GTKListStore添加(分段故障)



我试图将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);
}

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

>

修复程序的最简单方法是改用gtk_list_store_set()。阅读文档(无论如何,我都不确定在这种情况下是否会有所帮助...)。

我建议您在gdb中运行代码。您没有说您正在使用的是哪个IDE(如果有),但是您可能必须使用-g -O0选项重新编译该程序:

gcc -g -O0 <old options>

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

然后,您可以在gdb中运行该程序,并且在分割故障后,使用命令bt进行"回溯"。这将为您提供确切的函数,并使您更容易查明问题。

我还会尝试添加一个printf("%sn", filename);,只是您对Segfault的评论进行评论。然后,您可以查看何时发生segfault(如果成功通过)

相关内容

  • 没有找到相关文章

最新更新