2017-04-02 85 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

非常歡迎您!我怕我的記憶在我的失敗,我不能幫你,但我記得不是太硬,一對夫婦的谷歌搜索,你應該準備好了! –