【发布时间】:2019-10-15 03:46:29
【问题描述】:
它显示我的主函数在 HTSize 处读取的大小为 8 无效,并且它似乎对空哈希有效(它打印 0)但我认为问题是我的 HTCreate 中的初始化哈希作为参数传递在 HTSize 但未初始化。
我尝试过(不在显示的代码中)将参数作为 &Table 传递,定义为 HTSize(HThash**) 但没有解决它,程序没有运行并且 valgrind 显示“地址 0x0 不是堆栈'd, malloc'd 或(最近)free'd”。在函数内部,我还放置了一个指向哈希的指针 T 以取消引用 **hash。我在 linux 中工作。
typedef char* KeyType;
typedef int HTItem;
typedef struct node{
KeyType key;
HTItem item;
struct node *next;
}List;
typedef struct {
List *head;
}TableEntry;
typedef TableEntry *HTHash;
HTHash* HTCreate(void);
int HTSize(HTHash);
int TABLESIZE = 10;
int main(void)
{
HTItem *p;
HTHash *Table = HTCreate();
printf("%d\n",HTSize(*Table));
}
HTHash* HTCreate(void)
{
int i;
HTHash table = (HTHash)malloc(TABLESIZE*sizeof(TableEntry));
HTHash *T;
for(i=0;i<TABLESIZE;i++)
table[i].head = NULL;
T = &table;
return T;
}
int HTSize(HTHash hash)
{
int i,count=0;
List *temp = (List*)malloc(sizeof(List));
for(i=0;i<TABLESIZE;i++)
{
if(hash[i].head != NULL)
{
count++;
temp = hash[i].head->next;
while(temp != NULL)
{
count++;
temp = temp->next;
}
}
}
return count;
}
错误可能在 HTCreate 中,但我不确定。我检查了哈希是否在主函数中初始化并且确实如此。
【问题讨论】:
-
请提供minimal reproducible example,包括类型定义。
-
嗨,欢迎来到 Stack Overflow。您的代码中似乎缺少
HTHash的定义。请将edit它放入问题中提供minimal reproducible example。 -
在 C 中你 should not cast
malloc. -
HTCreate正在返回一个指向局部变量table的指针。 -
从
HTCreate返回HTHash*而不是普通的HTHash有什么用?
标签: c hash segmentation-fault