การใช้ For เพื่อสร้าง struct เพื่อเริ่มต้น

สวัสดี ฉันมีปัญหา ฉันกำลังพยายามเริ่มต้นแฮชเทเบิลด้วยอาร์เรย์ที่มีรายการ แต่เมื่อฉันใช้ลูป 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 loop เนื่องจากมันถูกสร้างขึ้นภายในลูป เมื่อคุณออกจากบล็อคโค้ดนั้น มันก็จะไม่มีอยู่อีกต่อไป การประกาศเป็นแบบโลคัลสำหรับ for loop block ของโค้ด   -  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 loop นั้น A จะมีอายุการใช้งานภายในบล็อกระหว่าง {} เท่านั้น เมื่อ for ออกจากลูป หน่วยความจำของ A จะถูกทำเครื่องหมายว่า release และโปรแกรมของคุณสามารถใช้งานได้อีกครั้งสำหรับทุกสิ่งที่ต้องการ - นั่นไม่ใช่สิ่งที่คุณต้องการ ด้วยการย้ายการประกาศไปนอก for loop คุณมั่นใจได้ว่า A ยังคงมี ในขอบเขต จนกว่าคุณจะออกจากบล็อกที่มี A

person David C. Rankin    schedule 31.10.2015
comment
ดีใจที่สามารถช่วยได้ ฉันโดนกัดครั้งสองครั้งแล้ว :) - person David C. Rankin; 01.11.2015