链表的数组初始化

时间:2018-02-02 07:24:43

标签: c arrays pointers struct linked-list

在我没有看到"类似的"问题,我找不到任何人真正试图初始化整个malloced"数组"为NULL。

我正在尝试创建哈希表。第一个malloc用于数组,第二个malloc用于创建哈希表结构以放入数组。我计划用链表实现冲突链(这里称为ListNode)。对数组进行mallocing并将其放入struct之后,我想将数组中的所有链表初始化为NULL。

截至目前,此代码将链接列表中的POINTERS指定为NULL(偶然......我不知道如何修复),因此它们指向内存位置0x0。不知何故,经过3次左右的迭代后,循环在底部,整个哈希表结构现在指向0x0,我得到一个seg错误。

我的所有指针突然变为空,而不仅仅是我的链表?我如何使它成为ListNode指针= NULL所以我可以对它们执行正常的链表操作?

typedef struct
{
    ListNode **array;
    /* more stuff */
} HTable;

void *HTCreate(unsigned sizes[], int numSizes){
  arr = (ListNode*)malloc(sizeof(ListNode) * sizes[0]);

  if(arr == NULL)
  {
      exit(1);
  }

  ht = (HTable*)malloc(sizeof(HTable));
  ht->array = &arr;
  ht->sizes = size;
  /* more initializing */
  for(i = 0; i < ht->sizes[ht->sizeIndex]; i++)
  {
      ht->array[i] = NULL;
  }

return (void *)ht; }

我有一些理论......它可能是&amp; arr和我用双指针混淆事物的问题,但我已经用结构中的双指针和单指针尝试了这个所以我彻底迷失了。

提前致谢!

2 个答案:

答案 0 :(得分:1)

使用您显示的代码,唯一有效的ht->array索引为0。其他一切都将超出范围。

如果你想要一个指针数组,你需要分配这样一个数组:

// Allocate an array of pointers, each pointer being initialized to NULL
ht->array = calloc(sizes[0], sizeof(ListNode *));

答案 1 :(得分:0)

你的代码中有一个悬空指针,除非你的所有变量都是全局变量,这将是糟糕的设计。

HTable *ht = malloc(sizeof(HTable));
...
return (void *)ht;

这个很好:你返回一个指向已分配内存的指针(注意don't cast malloc in C

但是这个错了:

(ListNode*) arr = malloc(sizeof(ListNode) * sizes[0]);
...
ht->array = &arr;  

arr是指向已分配内存块的本地指针。您可以安全地返回块的地址(arr),但不能返回指向它的本地指针的地址(&arr)。

除非你有充分的理由这样做,否则你应该删除一个间接级别:

typedef struct
{
    ListNode *array;
    /* more stuff */
} HTable;

然后

ht->array = arr;               // fine the address of an allocated bloc

如果确实需要两个间接级别,则必须使用动态分配指针:

(ListNode*) arr = malloc(sizeof(ListNode) * sizes[0]);
...
(ListNode **)parr = malloc(sizeof(ListNode **));
ht->array = parr;              // fine the address of an allocated pointer