1

我正在尝试创建自己的哈希表数据结构,但遇到了一个意想不到的问题,我无法解决,也没有找到令人满意的解决方案。

看,我有这个链表结构

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]留空,直到它实际被赋值。

如果我不执行for循环,则会发生这种情况:

if (entries[x] != NULL)  /* true, the array is initialized */
  entries[x]->v = value; /* SEGFAULT, there is no struct initialized */

如果我还没有为它分配一个 Link 结构,那么该if语句“应该”返回 false,但它没有。

解决这个问题的一种方法是使用 for 循环初始化链表的所有第一个链接,然后检查值,但这不是我想要的。

那么有谁知道按照我想要的方式解决这个问题的方法吗?

4

3 回答 3

1

好吧,你不能。未初始化的指针不一定NULL

于 2012-09-01T08:27:06.353 回答
1

您可以使用calloc而不是malloc在分配时使用entries

entries = calloc(sizeof(struct Link*),  N);
于 2012-09-01T08:31:46.803 回答
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; 
于 2012-09-01T08:38:02.213 回答