C GSList问题(GLib)

C GSList问题(GLib),c,programming-languages,glib,C,Programming Languages,Glib,嗨 我试图使用glib.h中的GSList,但在用char*元素填充列表时遇到了问题 代码如下: GSList * res = NULL; char * nombre; while (...) { nombre = sqlite3_column_text(resultado, 1); res = g_slist_append (res, nombre); } printf("number of elements: %i\n", g_slist_length(res)); p

我试图使用glib.h中的GSList,但在用char*元素填充列表时遇到了问题

代码如下:

GSList * res = NULL;
char * nombre;

while (...) {
 nombre = sqlite3_column_text(resultado, 1);
     res = g_slist_append (res, nombre);
}   

printf("number of elements: %i\n", g_slist_length(res));
printf("last element: %s\n", g_slist_last(res)->data);
当我打印元素数时,我看到列表不是空的。但当我打印最后一个元素时,它没有显示任何内容

我做错了什么


谢谢

列表将只保留指针值。如果指针指向的内存稍后被覆盖,则会出现问题

解决方案可以是在存储字符串之前对其进行以下操作:

res = g_list_append(res, g_strdup(nombre));
这将存储指向新字符串的指针,这些指针存储在新分配的内存中,每个字符串都不同。当然,您需要在以后通过对每个存储的指针调用
g_free()
来清除此问题,否则您的程序将泄漏内存:

g_list_free_full(res, g_free);

这将在释放列表本身之前,对每个数据指针调用标准的
函数。

列表将只保留指针值。如果指针指向的内存稍后被覆盖,则会出现问题

解决方案可以是在存储字符串之前对其进行以下操作:

res = g_list_append(res, g_strdup(nombre));
这将存储指向新字符串的指针,这些指针存储在新分配的内存中,每个字符串都不同。当然,您需要在以后通过对每个存储的指针调用
g_free()
来清除此问题,否则您的程序将泄漏内存:

g_list_free_full(res, g_free);

这将在释放列表本身之前,对每个数据指针调用标准的
函数。

可能您的最后一列文本为空?不,不,上面有一个字符串。之前,我用printfMaybe测试了它。你的最后一列文本是空的吗?不,不,上面有一个字符串。之前,我用一个printf@mccrank字体很高兴它有帮助。也可以随意接受答案。@mccrank:很高兴这有帮助。也可以随意接受答案。