gpt4 book ai didi

c - C 中指针的哈希表?

转载 作者:太空宇宙 更新时间:2023-11-04 06:36:48 25 4
gpt4 key购买 nike

我正在尝试构建一个初始化哈希表,其指针指向我程序中的另一个结构。但是当我尝试初始化(H)时,它似乎给了我一个段错误。我想我可能没有正确分配内存,但我不确定这是否是段错误的真正含义。按照它的设置方式,H->hashtable 应该是一个哈希节点数组,对吧?哈希节点本身是指向我的其他结构的指针。为什么我只在初始化时遇到段错误?

    #include <stdio.h>
#include <stdlib.h>

typedef struct Position{
char data[12];
struct Hashnode *previous;
struct Position *next;
char letter;
char direction[5];
} *position;

typedef struct Hashnode{
struct Position *INSIDE;
} *hashnode;

typedef struct hash_table{
hashnode *hashtable
} *HTABLE;


HTABLE NewHashtable(){
HTABLE H = (HTABLE) malloc(sizeof(struct hash_table));
if(H == NULL){ printf("Malloc for new hashtable failed."); exit(1);}
return H;
}



void initialize(HTABLE H){

H->hashtable = (hashnode*) malloc(100003*sizeof(hashnode));

int toofer;
for(toofer = 0; toofer<100003; toofer++){
H->hashtable[toofer]->INSIDE = NULL;
}
}

int main(){
HTABLE H = NewHashtable();
initialize(H);

return 0;
}

最佳答案

这个:

HTABLE H = (HTABLE) malloc(sizeof(struct hash_table));

太可怕了。它将 typedef:ed 指针(为什么人们仍然这样做?)与底层 struct 名称混合在一起,让读者的工作是确保它们匹配。另外,that cast is a bad idea, too .

应该是:

HTABLE H = malloc(sizeof *H);

如果您坚持保留 typedef

就是说,initialize() 中的代码可能在其 malloc() 调用中失败,该调用在被依赖之前未进行检查。这是一个非常糟糕的主意。

此外,对于分配的什么存在混淆。 malloc() 代码分配了 100003*sizeof(hashnode),但是 hashnode 是(再次)typedef:ed作为一个指针,而不是一个结构。然后指针在循环中被取消引用,导致困惑。

关于c - C 中指针的哈希表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13916335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com