c - 使用 For 创建结构体进行初始化

标签 c list hashtable

嗨,我有一个问题,我正在尝试使用包含列表的数组初始化哈希表,但是当我使用 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

如果我做一个 打印:

选项卡[0]:1,2,3

选项卡[1]:1,2,3

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

谢谢!

最佳答案

继续评论,换句话说,您需要类似于以下内容的内容以避免 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 循环 block 中,A仅在 {} 之间的 block 内具有生命周期。当for循环退出时,A的内存被标记为已发布,然后可以由您的程序再次使用它所需的任何内容 - 这不是您想要的。通过将声明移到 for 循环之外,您可以确保 A继续存在于范围内,直到您退出包含 A 的 block 为止.

关于c - 使用 For 创建结构体进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33457409/

相关文章:

C hello world 程序因变量输出而崩溃

c - 按位和C编程

c - 内存段栈和堆

Python lambda 列表 : different behavior of list comprehension, for 和 for 在函数中

java - 数组中每个位置的链表

PowerShell:组合两个哈希表

c++ - 在 Windows 环境中使用 C/C++ 联网

java - 迭代两个列表并提取一些东西的最佳方法?

C++列表分配不规则内存

android - 如何从哈希表中获取位图图像到简单的适配器中以在 imageview 中查看列表 Activity