Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C] заполнение списка

40K
27 ноября 2009 года
himas
31 / / 13.11.2009
написал код заполнения списка:
Код:
typedef struct qlist
{
    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 указывает не на первый элемент списка, а на последний - почему?

297
27 ноября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: himas
то есть указатель first указывает не на первый элемент списка, а на последний - почему?



Потому что вы присваиваете указатель. А надо данные копировать.
Вы грамотно копируете данные в bquery. Так же надо копировать и в tmp->query (и не забыть выделить память...)

40K
27 ноября 2009 года
himas
31 / / 13.11.2009
Цитата: koodeer
Потому что вы присваиваете указатель. А надо данные копировать.
Вы грамотно копируете данные в bquery. Так же надо копировать и в tmp->query (и не забыть выделить память...)


проблема заключалась в том, что при каждой итерации цикла значение переменной bquery изменялось, а в список я передавал не ее значение, а ее адрес, который оставался неизменным, поэтому при изменении значения переменной по всему листу значения изменялись.

в данной ситуации возможны 2 варианта действий:
1. передавать в список не указатель, а значение переменной, предварительно выделив память под целевую переменную (ваш совет)
2. иницилизировать для bquery память при каждой итерации цикла

392
29 ноября 2009 года
cronya
421 / / 03.01.2009
himas, а какой список то я не пойму? Где у него начало где конец??? Я может слепой?:confused:
Может какой то новый способ заполнения списка появился и я не знаю его :D Грубо говоря я вижу тока связи! а к чему они пределаны я не пойму.
5.3K
29 ноября 2009 года
!Волк
95 / / 19.07.2006
Цитата: himas

в данной ситуации возможны 2 варианта действий:
1. передавать в список не указатель, а значение переменной, предварительно выделив память под целевую переменную (ваш совет)
2. иницилизировать для bquery память при каждой итерации цикла


Выделяешь память для tmp->query и после этого в нее формируешь строку. Переменная bquery получается не нужна.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог