Проблема с GSList (GLib) - PullRequest
0 голосов
/ 10 мая 2011

HI

Я пытаюсь использовать GSList из glib.h, но у меня возникают проблемы при заполнении списка элементами char *.

Вот код:

GSList * res = NULL;
char * nombre;

while (...) {
 nombre = sqlite3_column_text(resultado, 1);
     res = g_slist_append (res, nombre);
}   

printf("number of elements: %i\n", g_slist_length(res));
printf("last element: %s\n", g_slist_last(res)->data);

Когда я печатаю количество элементов, я вижу, что список не пустой. Но когда я печатаю последний элемент, он ничего не показывает ...

Что я делаю не так?

Спасибо!

1 Ответ

3 голосов
/ 10 мая 2011

В списке будет сохранено только значение указателя. Если память, на которую указывает указатель, позже будет перезаписана, у вас будут проблемы.

Решением может быть дублирование строки перед ее сохранением:

res = g_list_append(res, g_strdup(nombre));

Это будет хранить указатели на новые строки, хранящиеся в недавно выделенной памяти, отличающиеся для каждой строки. Конечно, вам нужно будет впоследствии это исправить, вызвав g_free() для каждого из сохраненных указателей, иначе ваша программа утечет память:

g_list_free_full(res, g_free);

Вызывает стандартную функцию <a href="http://developer.gnome.org/glib/stable/glib-Memory-Allocation.html#g-free" rel="nofollow">g_free()</a> для каждого указателя данных перед освобождением самого списка.

...