Menggunakan For untuk membuat struct untuk diinisialisasi

Hai, saya punya masalah. Saya mencoba menginisialisasi tabel hash dengan array yang berisi daftar tetapi ketika saya menggunakan loop for, semua data "dibagikan". Saya harus menginisialisasi setiap tahun seperti itu:

   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

Sekarang saya mencetak tab[0] dan tab[1] dengan fungsi saya sendiri dan saya mendapatkannya

tab[0] = 1,2

tab[2]= 3

Oke, itu berfungsi sesuai keinginan saya

Jika saya melakukan seperti itu, itu tidak akan berhasil :

   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

Jika saya melakukan printf :

tab[0] : 1,2,3

tab[1] : 1,2,3

Jadi masalahnya adalah seperti saya mencoba membuat "banyak objek" yang akan menjadi kepala daftar, dan untuk masing-masing objek saya perlu menginisialisasi array dengan ukuran 100, itulah sebabnya saya ingin melakukan loop

Terima kasih !


person Foushi    schedule 31.10.2015    source sumber
comment
tidakkah Anda lupa & pada pernyataan INIT_LIST_HEAD di dalam klausa for?   -  person hdlopez    schedule 01.11.2015
comment
Anda mengalami masalah scope, Anda harus memindahkan struct objec_listt A; ke luar perulangan for. Karena dibuat di dalam loop, setelah Anda keluar dari blok kode itu, kode tersebut tidak ada lagi. Deklarasi tersebut bersifat lokal pada blok kode for loop.   -  person David C. Rankin    schedule 01.11.2015
comment
Ya, saya sudah mencoba di luar loop tetapi tidak berhasil :(   -  person Foushi    schedule 01.11.2015
comment
Apakah Anda mencoba sesuatu yang mirip dengan yang saya posting di bawah?   -  person David C. Rankin    schedule 01.11.2015


Jawaban (1)


Melanjutkan dari komentar, dengan kata lain, Anda memerlukan sesuatu yang serupa dengan yang berikut ini untuk menghindari deklarasi dalam blok kode loop 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

Dalam contoh Anda, ketika Anda mendeklarasikan struct objec_listt A di dalam blok perulangan for, A hanya memiliki masa hidup di dalam blok di antara {}. Saat perulangan for keluar, memori A ditandai sebagai telah dilepaskan dan kemudian dapat digunakan kembali oleh program Anda untuk apa pun yang diperlukan -- bukan itu yang Anda inginkan. Dengan memindahkan deklarasi ke luar perulangan for, Anda memastikan bahwa A tetap ada dalam cakupan hingga Anda keluar dari blok yang berisi A.

person David C. Rankin    schedule 31.10.2015
comment
Senang aku dapat membantu. Saya pernah digigit oleh hal itu satu atau dua kali :) - person David C. Rankin; 01.11.2015