You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言GList中存储结构体或多变量?报错求助

问题解决:GList存储自定义结构体或双整数的正确方式

错误根源分析

你的代码存在两个关键问题:

  1. typedef语法错误:定义结构体时,typedef struct client_data { ... }; 缺少类型别名,正确写法需要在结构体末尾添加别名(比如ClientData),方便后续直接使用别名代替struct client_data。
  2. 类型不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:23:16