Использование For для создания структуры для инициализации

Здравствуйте, у меня проблема. Я пытаюсь инициализировать хэш-таблицу массивом, содержащим список, но когда я использую цикл for, все данные "общие". Я должен инициализировать вручную так:

   struct objec_listt A,B; // Initialization of 2 two structure A and B
   INIT_LIST_HEAD(&A.list); // A is headlist
   INIT_LIST_HEAD(&B.list); // B is headlist
   hashtable->tab[0]= &A; // I insert A into the array
   hashtable->tab[1]= &B; // I insert B into the array

   insert(1,tab[0]); //  insert 1, not real syntax 
   insert(2,tab[0]); //  insert 2
   insert(3,tab[1]); //  insert 3

Теперь я печатаю tab[0] и tab[1] со своей собственной функцией и получаю

вкладка [0] = 1,2

вкладка [2] = 3

хорошо работает как я хочу

Если я сделаю так, это не сработает:

   for(i=0; i<2; i++)
   {
     struct objec_listt A;
     INIT_LIST_HEAD(&A.list);
     hashtable->tab[i] = &A
   }

   insert(1,tab[0]); //  insert 1,
   insert(2,tab[0]); //  insert 2
   insert(3,tab[1]); //  insert 3

Если я делаю printf :

вкладка [0] : 1,2,3

вкладка [1] : 1,2,3

Итак, проблема в том, что я пытаюсь создать «много объектов», которые будут во главе списка, и для каждого мне нужно инициализировать массив размером 100, поэтому я ищу цикл

Спасибо !


person Foushi    schedule 31.10.2015    source источник
comment
разве вы не забыли оператор & в операторе INIT_LIST_HEAD внутри предложения for?   -  person hdlopez    schedule 01.11.2015
comment
Вы столкнулись с проблемой scope, вы должны переместить struct objec_listt A; за пределы цикла for. Поскольку он создается внутри цикла, после выхода из этого блока кода он больше не существует. Объявление было локальным для блока кода цикла for.   -  person David C. Rankin    schedule 01.11.2015
comment
Ну, я уже пробовал вне цикла, но это не работает :(   -  person Foushi    schedule 01.11.2015
comment
Вы пробовали что-то похожее на то, что я написал ниже?   -  person David C. Rankin    schedule 01.11.2015


Ответы (1)


Другими словами, продолжая комментарий, вам понадобится что-то похожее на следующее, чтобы избежать объявления в блоке кода цикла for:

struct objec_listt A[2];

for(i=0; i<2; i++)
{
    INIT_LIST_HEAD(&A[i].list);
    hashtable->tab[i] = &A[i];
}

insert(1,tab[0]); //  insert 1,
insert(2,tab[0]); //  insert 2
insert(3,tab[1]); //  insert 3

В вашем примере, когда вы объявляете struct objec_listt A в блоке цикла for, A имеет время жизни только в блоке между {}. Когда цикл for завершается, память A помечается как освобожденная и затем может снова использоваться вашей программой для всего, что ей нужно — это не то, что вам нужно. Перемещая объявление за пределы цикла for, вы гарантируете, что A продолжает существовать в области видимости до тех пор, пока вы не выйдете из блока, содержащего A.

person David C. Rankin    schedule 31.10.2015
comment
Рад, что смог помочь. Я был укушен этим раз или два :) - person David C. Rankin; 01.11.2015