使用For创建struct进行初始化

时间:2015-10-31 22:43:05

标签: c list hashtable

嗨我有一个问题我正在尝试使用包含列表的数组初始化哈希表,但是当我使用 for 循环时,所有数据都是“共享”的。我要像那样初始化mannualy:

   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],我得到了

tab [0] = 1,2

tab [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:

tab [0]:1,2,3

标签[1]:1,2,3

所以问题就像我正在尝试创建“许多对象”,它将成为列表的头部,并为每个人 我需要初始化一个大小为100的数组,这就是为什么我要使用循环

谢谢!

1 个答案:

答案 0 :(得分: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

在您的示例中,当您在for循环块中声明struct objec_listt A时,A仅在{}之间的块中具有生命周期。当for循环退出时,A的内存被标记为已释放,然后您的程序可以再次使用它所需的任何内容 - 这不是您想要的。通过在for循环之外移动声明,可以确保A在范围中继续存在,直到退出包含A的块。