Как прочитать значение из структуры из GList? - PullRequest
0 голосов
/ 17 января 2019

Не могу прочитать хорошее значение из GList.

Я объявляю struct и инициализирую переменную a номером в цикле for, затем добавляю к g_list_append.

g_list_nth_data возвращает указатель; Я пытаюсь привести его к моему типу структуры и прочитать его член, но я получаю 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 голосов
/ 17 января 2019

Вам нужно выделить копию 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), так как он должен выполнять итерацию по длине списка каждый раз, чтобы найти конец. В общем, использование связанного списка - плохая идея, а массив указателей (GPtrArray в GLib) обычно является гораздо более подходящей структурой данных.

...