我无法从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
答案 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
)通常是更合适的数据结构。