我读了this帖子,这有助于我找到正确的解除引用,但后来我去创造了帖子答案的作者要避免的情况,哈哈。
我想要完成的是创建基本文件浏览器(根据book我的阅读)。下面的代码应该是读取目录内容并将我选择的详细信息填入struct
。然后将struct
附加为data
的{{1}}成员。然后,该列表用于填充GSList
的行数据,依此类推。
GtkTreeView
努力理解为什么我的文件名返回空白并且每个人都有相同的内存地址,typedef struct
{
gchar *name, *size, *date_modified;
}FileProperties;
//...
static void refresh_directory_listing(GtkTreeView *treeview)
{
GtkListStore *store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
GSList *files = NULL;
GtkTreeIter iter;
get_current_directory_contents(&files);
for(GSList *current = files; current != NULL; current = g_slist_next(current))
{
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, FILE_NAME, ((FileProperties *) current->data)->name,
FILE_SIZE, ((FileProperties *) current->data)->size,
DATE_MODIFIED, ((FileProperties *) current->data)->date_modified, -1);
}
gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(store));
g_object_unref(store);
g_slist_free(files);
}
static void get_current_directory_contents(GSList **files)
{
GDir *current_dir = g_dir_open(g_get_current_dir(), 0, NULL);
gchar *file_name = NULL;
FileProperties *file = g_malloc(sizeof(FileProperties));
while((file_name = (gchar *) g_dir_read_name(current_dir)))
{
memset(file, 0, sizeof(FileProperties));
file->name = g_strdup(file_name);
file->size = g_strdup_printf("Nope");
file->date_modified = g_strdup_printf("Nuh uh");
*files = g_slist_append(*files, file);
}
g_free(file);
}
直接将g_slist_append()
结构交给我是显而易见的。因此,所有内容都引用了相同的FileProperties
,它会被覆盖并最终被释放。糟糕。
我的问题是:在{}之间来回交换struct
GSList
个struct
的适当方法是什么?
答案 0 :(得分:1)
您只是在FileProperties
循环之前分配一个 while
结构,然后您只需更改该单个结构的内容,并将其追加多次。
您需要为要存储其属性的每个文件分配一个 FileProperties
结构实例。
在循环内移动分配,替换(假的)memset()
:
while((file_name = (gchar *) g_dir_read_name(current_dir)))
{
FileProperties *file = g_malloc(sizeof *file);
/* rest of loop here ... */
}