[C] заполнение списка
{
char *query;
struct qlist *next;
};
main()
{
int cnt = 0;
char *scnt = (char*)calloc(1, 1);
char bquery[9] = {0};
struct qlist *first = NULL;
struct qlist *last = NULL;
for(cnt = 1; cnt <= 3; cnt++)
{
// готовим строку
strcpy(bquery, "");
strcat(bquery, "try=");
sprintf(scnt, "%d", cnt);
strcat(bquery, scnt);
printf("%s\n", bquery);
struct qlist *tmp = (struct qlist*)calloc(1, sizeof(struct qlist));
tmp->query = bquery;
tmp->next = NULL;
if (first == NULL) first = tmp;
else last->next = tmp;
last = tmp;
}
printf("%s\n", last->query);
printf("%s\n", first->query);
}
после последними двумя строками получаем:
try=3
try=3
то есть указатель first указывает не на первый элемент списка, а на последний - почему?
Потому что вы присваиваете указатель. А надо данные копировать.
Вы грамотно копируете данные в bquery. Так же надо копировать и в tmp->query (и не забыть выделить память...)
Вы грамотно копируете данные в bquery. Так же надо копировать и в tmp->query (и не забыть выделить память...)
проблема заключалась в том, что при каждой итерации цикла значение переменной bquery изменялось, а в список я передавал не ее значение, а ее адрес, который оставался неизменным, поэтому при изменении значения переменной по всему листу значения изменялись.
в данной ситуации возможны 2 варианта действий:
1. передавать в список не указатель, а значение переменной, предварительно выделив память под целевую переменную (ваш совет)
2. иницилизировать для bquery память при каждой итерации цикла
Может какой то новый способ заполнения списка появился и я не знаю его :D Грубо говоря я вижу тока связи! а к чему они пределаны я не пойму.
в данной ситуации возможны 2 варианта действий:
1. передавать в список не указатель, а значение переменной, предварительно выделив память под целевую переменную (ваш совет)
2. иницилизировать для bquery память при каждой итерации цикла
Выделяешь память для tmp->query и после этого в нее формируешь строку. Переменная bquery получается не нужна.