我试图将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(如果成功通过)