我正在创建自己的哈希表数据结构,但我遇到了一个意想不到的问题,我无法解决,但还没有找到令人满意的解决方案。
请参阅,我有这个链表结构
struct Link
{
int v;
struct Link* next;
}
然后在哈希表结构中我想跟踪数组链表,如下所示:
struct Link** entries;
我遇到的是,为了实现这一点,我首先必须像这样初始化数组:
entries = malloc(sizeof(struct Link*) * N);
for (i = 0; i < N; i++)
entries[i] = malloc(sizeof(struct Link));
我想要的不是必须执行初始化结构的for
循环,因为这不是链接列表的工作方式,我希望将entries[x]
留空,直到它实际被赋值为止。< / p>
如果我不执行for
循环,则会发生这种情况:
if (entries[x] != NULL) /* true, the array is initialized */
entries[x]->v = value; /* SEGFAULT, there is no struct initialized */
如果我还没有为它分配一个Link结构,那么if
语句'应该'返回false,但它没有。
解决这个问题的一种方法是用for循环初始化链表的所有第一个链接,然后检查值,但这不是我想要的。
那么有没有人知道以我想要的方式解决这个问题?
答案 0 :(得分:1)
NULL
。
答案 1 :(得分:1)
分配calloc
时,您可以使用malloc
而不是entries
,如下所示:
entries = calloc(sizeof(struct Link*), N);
答案 2 :(得分:0)
在为malloc()
分配空间后,您需要初始化指针数组。您可以使用另一个for
- 循环,如:
for (i = 0; i < N; i++)
{
entries[i] = NULL;
}
或只是使用calloc()
来分配数组。这会将所有元素设置为0
。
entries = calloc(N, sizeof(struct Link*));
之后你需要根据需要分配元素:
if (entries[x] == NULL)
{
entries[x] = malloc(sizeof(struct Link));
}
entries[x]->v = value;