gpt4 book ai didi

c - GS 结构体列表

转载 作者:行者123 更新时间:2023-11-30 15:32:10 29 4
gpt4 key购买 nike

我读了 this 线程,它帮助我正确地解决了取消引用的问题,但后来我去创建了帖子答案作者所说要避免的情况,哈哈。

我想要完成的是创建一个基本的文件浏览器(根据我正在阅读的book)。下面的代码应该读取目录内容并将我选择的详细信息填充到 struct 中。然后将该struct 附加为GSListdata 成员。然后,该列表用于填充 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,该结构不断被覆盖并最终被释放。哎呀。

我的问题是:在函数之间来回传递 structGSList 的适当方法是什么?

最佳答案

您仅在 while 循环之前分配一个 FileProperties 结构,然后只需更改该单个结构的内容,并附加多次。

您需要为每个要存储其属性的文件分配一个 FileProperties 结构实例。

将分配移动到循环内,替换(虚假的)memset():

while((file_name = (gchar *) g_dir_read_name(current_dir)))
{
FileProperties *file = g_malloc(sizeof *file);

/* rest of loop here ... */
}

关于c - GS 结构体列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24370116/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com