#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: Рад, что это помогло. Не стесняйтесь также принять ответ.