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