【问题标题】:Array of Structs - Hash Table结构数组 - 哈希表
【发布时间】:2017-08-27 14:08:33
【问题描述】:

我对这个结构有疑问,我不明白为什么不起作用。我创建了一个具有 3 个值的结构,我想要这个 SIZE = 100 的数组。但我对 malloc 以及它在这种情况下的工作方式感到困惑。

#define SIZE 100

typedef struct entry {
    long id;
    int r1;
    int r2;
    int r3;
};

typedef struct entry * THash; //[SIZE];

THash init ()
{
    int i;
    THash  t = malloc(SIZE*sizeof(struct entry));

for(i = 0; i<SIZE; i++){
    t[i] = malloc(sizeof(struct entry));
    t[i].id = -1;
    t[i].r1 = -1;
    t[i].r2 = -1;
    t[i].r3 = -1;

}
return t;
}

【问题讨论】:

  • 你不需要分配内存两次。第一个malloc就足够了。它为所有 100 个结构分配内存。您可以直接在循环内使用它们。还记得在使用后释放内存。这通常是一种很好的做法。

标签: c pointers hash struct malloc


【解决方案1】:

因此,正如 Ajay 在评论中指出的那样,您在当前程序中所做的是两次分配内存。 让我们分析代码中的两个不同的 malloc,看看它们在哪些方面做得更好,以便您了解正在发生的事情 :) 第一个malloc,即:

THash  t = malloc(SIZE*sizeof(struct entry));

正在使用惊人的(和拯救生命的)C 函数 sizeof 获取结构的尺寸,并分配结构所需的空间 100 次。也就是说,它在内存中获取一个指针并从该点向前分配内存,直到达到 100 个结构所需的数量。然后它将指针存储在 t 中,使其有效地成为一个数组。

然后您可以使用 t[0]、t[1] 等简单地访问您的数组及其内容,就好像它是一个简单的数组一样。

你在用你的第二个malloc做什么,就是

t[i] = malloc(sizeof(struct entry));

正在重新分配您已经分配的一些空间,并尝试将指向新分配区域的指针分配给指向结构的指针(这很混乱,我知道)事实上,如果您尝试编译您的代码,您'将得到以下错误并且函数将无法编译:

error: assigning to 'struct entry' from incompatible type 'void *'
    t[i] = malloc(sizeof(struct entry));
         ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

因此,为了使该功能正常工作,您只需删除第二个 malloc。我希望我已经足够清楚该功能在您的情况下的作用,但如果您需要进一步解释,请随时提出更多问题

【讨论】:

  • 感谢您的精彩回答!!最后一个问题:如果我想使用“->”而不是“。”在 t[i].id 中,我需要进行哪些更改?
  • 不客气!恐怕我的记忆力下降了,我帮不了你,但我记得这不是太难,谷歌搜索了几次,你应该都准备好了!
猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2015-06-08
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多