Проблема с GSList (GLib)

#c #programming-languages #glib

#c #языки программирования #glib

Вопрос:

привет,

Я пытаюсь использовать 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: %in", g_slist_length(res));
printf("last element: %sn", g_slist_last(res)->data);
  

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

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

Спасибо!

Комментарии:

1. Возможно, ваш текст в последнем столбце пуст?

2. нет, нет, в нем есть строка. Ранее я тестировал его с помощью printf

Ответ №1:

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

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

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

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

 g_list_free_full(res, g_free);
  

Это вызывает стандартную g_free() функцию для каждого указателя на данные, прежде чем освободить сам список.

Комментарии:

1. @mccrank: Рад, что это помогло. Не стесняйтесь также принять ответ.