如何从GList的struct读取值?

时间:2019-01-17 16:18:29

标签: c glib

我无法从GList读取好的值。

我声明一个struct,并使用for循环中的数字初始化其a变量,然后将其添加到g_list_append

g_list_nth_data返回一个指针;我尝试将其转换为我的struct类型并读取其成员,但得到9。

我在做什么错了?

#include "glib.h"
#include <stdio.h>



typedef struct MyType
{
    int a;
}mytype_t;



int main(int argc, char* argv[])
{
    printf("start\n");

    mytype_t myt;

    GList *l = NULL;

    for(int i=0;i<10;i++)
    {
        myt.a = i;
        l = g_list_append(l, &myt);
    }


    printf("length: %d\n", g_list_length(l));

    printf("5th item a value: %d\n", ((mytype_t*)g_list_nth_data(l,4))->a );



    return 0;
}

output:
    start
    length: 10
    5th item value: 9

1 个答案:

答案 0 :(得分:0)

您需要在堆上为mytype_t分配一个副本,并附加到链表中。在每个&myt调用中观察g_list_append()的值:对于每个i的值,它都是相同的,因为它指向相同的堆栈内存块。

您可以执行以下操作:

mytype_t *myt = g_new0 (mytype_t, 1);
myt->a = i;
l = g_list_append (l, myt);

在您的循环中。

请注意,在循环中调用g_list_append()的开销为O(N ^ 2),因为每次都必须遍历列表的长度才能找到结尾。通常,使用链接列表不是一个好主意,并且指针数组(GLib中的GPtrArray)通常是更合适的数据结构。