首页 文章

链表的数组初始化

提问于
浏览
0

在我因为没有查看“类似”问题而被推翻之前,我找不到任何真正尝试将整个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; }

我有一些理论......这可能是&arr和我用双指针混淆事情的问题,但我在结构中用双指针和单指针试了这个,所以我彻底迷失了 .

提前致谢!

2 回答

  • 0

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

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

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

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

    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 是指向已分配内存块的本地指针 . 您可以安全地返回bloc的地址( 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
    

相关问题