在我没有看到"类似的"问题,我找不到任何人真正试图初始化整个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和我用双指针混淆事物的问题,但我已经用结构中的双指针和单指针尝试了这个所以我彻底迷失了。
提前致谢!
答案 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