如何在C语言GList中存储结构体或多变量?报错求助
问题解决:GList存储自定义结构体或双整数的正确方式
错误根源分析
你的代码存在两个关键问题:
- typedef语法错误:定义结构体时,
typedef struct client_data { ... };缺少类型别名,正确写法需要在结构体末尾添加别名(比如ClientData),方便后续直接使用别名代替struct client_data。 - 类型不匹配:
g_list_append的第二个参数要求是gpointer(即void*指针类型),但你直接传入了结构体变量(值类型),导致编译器报错「结构体数据类型不兼容」。
方案1:用动态分配的结构体指针存入GList(推荐)
这是GList存储自定义数据的标准方式,动态分配的内存不会随局部变量销毁而失效,适合长期保存数据:
#include <glib.h> // 修正typedef语法,添加类型别名ClientData typedef struct { int int1; int int2; } ClientData; int main() { GList *client_datalist = NULL; // 用glib的g_new动态分配结构体内存,等价于malloc但更适配glib生态 ClientData *temp_data = g_new(ClientData, 1); temp_data->int1 = 1; temp_data->int2 = 100; // 将结构体指针存入链表,注意接收返回值(g_list_append会返回新的链表头) client_datalist = g_list_append(client_datalist, temp_data); // 示例:访问链表中的数据 ClientData *data = g_list_nth_data(client_datalist, 0); g_print("int1: %d, int2: %d\n", data->int1, data->int2); // 释放内存:用g_list_free_full自动销毁每个节点的data,避免内存泄漏 g_list_free_full(client_datalist, g_free); return 0; }
方案2:直接存入两个整数(无需结构体)
如果不想用结构体,可以利用64位系统中gpointer占8字节的特性,将两个32位整数打包成一个64位整数,通过glib的类型转换宏存入链表:
#include <glib.h> int main() { GList *client_datalist = NULL; int int1 = 1; int int2 = 100; // 把两个int打包为gint64:高32位存int1,低32位存int2 gint64 packed_data = ((gint64)int1 << 32) | (int2 & 0xFFFFFFFFLL); // 转换为gpointer存入链表 client_datalist = g_list_append(client_datalist, INT64_TO_POINTER(packed_data)); // 取出并解包数据 gint64 unpacked_data = GPOINTER_TO_INT64(g_list_nth_data(client_datalist, 0)); int retrieved_int1 = (int)(unpacked_data >> 32); int retrieved_int2 = (int)(unpacked_data & 0xFFFFFFFFLL); g_print("int1: %d, int2: %d\n", retrieved_int1, retrieved_int2); // 直接销毁链表即可,无需额外释放data(数据存在指针本身的位里) g_list_free(client_datalist); return 0; }
注意:这种方法仅适用于64位系统,可读性远不如结构体,仅适合简单场景。
内容的提问来源于stack exchange,提问作者bangingmyheadontable
相关产品推荐
相关产品推荐

