不,您的类型不匹配。
您是否尝试分配哈希条目表(即table[i]
is的类型struct hash_entry
)、指向hash_entries的指针table[i]
表(即is的类型struct hash_entry *
)或其他?根据您的代码读取方式,我假设第一种情况,但如果有错误请告诉我。
假设您正在动态分配 的表struct hash_entry
,则您在调用者中的表声明应该是
struct hash_entry *table; // 1 *, 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++)
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;
}
编辑maketable
示例中有一个错误;table
在应用下标之前需要取消引用,即(*table)[i]
. 我们将下标应用于table
指向 的内容,而不是表指针本身。
很抱歉有任何混淆。