不可以。您的類型不匹配。
你試圖分配散列項(即的table[i]
類型是struct hash_entry
)的表中,指針到hash_entries(即的table[i]
類型是struct hash_entry *
),或別的東西的桌子嗎?根據你的代碼的讀法,我假設第一個案例,但讓我知道如果這是錯誤的。
假設你動態分配的struct hash_entry
一個表,你在來電錶的聲明應該是
struct hash_entry *table; // 1 *, no array dimension
的功能應該是稱爲作爲
int result = maketable(&table, number_of_elements);
和定義 as
int maketable (struct hash_entry **table, size_t size)
{
int r = 0;
// sizeof **table == sizeof (struct hash_entry)
*table = malloc(sizeof **table * size);
// *ALWAYS* check the result of malloc()
if (*table)
{
size_t i;
for (i = 0; i < size; i++)
memset(&(*table)[i], 0, sizeof (*table)[i]);
r = 1;
}
return r;
}
有幾點需要指出。首先,不要投下malloc()
的結果。從C89開始,您不需要,如果忘記包含stdlib.h或者沒有原型malloc()
的範圍,則演員會壓縮診斷。其次,您可以在對象上使用sizeof
運算符而不是類型。這可以幫助減少一些維護令人頭痛的問題(例如,如果在參數列表中更改了table
的類型,則不必隨其更改sizeof
呼叫)。
最後,請注意表的地址正在傳遞給函數;由於我們試圖寫入指針值,我們必須將指針傳遞給該指針。
如果你試圖創建指針表來struct hash_entry
,代碼大多是相同的,間接的只是一個額外的級別:
您的來電錶的聲明應該是
struct hash_entry **table; // 2 *, no array dimension
的功能應該是稱爲作爲
int result = maketable(&table, number_of_elements);
和定義作爲
int maketable (struct hash_entry ***table, size_t size)
{
int r = 0;
// sizeof **table == sizeof (struct hash_entry *)
*table = malloc(sizeof **table * size);
// *ALWAYS* check the result of malloc()
if (*table)
{
size_t i;
for (i = 0; i < size; i++)
(*table)[i] = NULL;
r = 1;
}
return r;
}
EDIT有一個在maketable
實例中的錯誤;需要在應用下標之前取消table
,即(*table)[i]
。我們正在將下標應用到table
指向,而不是表指針本身。
對不起,有任何混淆。
我不明白。你在堆棧中爲變量分配內存,然後在函數中重新分配一些內容? - 此外,'table'是一個局部變量。你正在分配一些東西,並將它分配給'table',當函數返回時它將消失,導致內存泄漏。 – 2010-01-26 23:01:47
問題是我也不太明白。我的struct hash_entry ** table [size]聲明是否爲我隱式分配內存?在這種情況下,當我聲明它們時,我仍然需要爲自己的hash_entrys提供malloc,對吧? – 2010-01-26 23:03:32
該聲明爲指向堆棧上類型爲「hash_entry」的指針的大小爲「size」的數組分配內存。它不會爲陣列元素要指向的位置分配內存。 – 2010-01-26 23:05:01