2017-04-02 84 views
-1

我有这个结构的问题,我不明白为什么不起作用。我创建了一个具有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; 
} 
+1

你不需要两次分配内存问更多的问题。第一个malloc就够了。它为所有100个结构分配内存。你可以直接在循环中使用它们。也请记住在使用后释放内存。这通常是一个很好的做法。 –

回答

0

你在当前的程序在做什么是,为阿贾伊在评论中指出,两次分配的内存。 让我们来分析一下在你的代码的两种不同的mallocs,看看他们在做什么更好,所以你能理解发生了什么:) 第一malloc的,那就是:

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

用惊人的把你的结构尺寸(和救生)C功能sizeof并分配结构所需的空间100次。那就是在内存中取一个指针,并从该点分配内存直到达到100个结构所需的数量。然后将指针存储起来,使其成为一个数组。

可以然后只需访问阵列,并且通过采用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。我希望我自己很清楚什么功能是你的处境做什么,但觉得免费的,如果您需要进一步的解释

+1

感谢这个惊人的答案!最后一个问题:如果我想用“ - >”替代“。”。在t [i] .id中,我需要做些什么改变? – Puthz

+0

非常欢迎您!我怕我的记忆在我的失败,我不能帮你,但我记得不是太硬,一对夫妇的谷歌搜索,你应该准备好了! –