我有一个Structs数组,我将它传递给一个函数。然后我检查该数组的索引以查看它是否为NULL,此时它应该是。问题是将它与NULL进行比较并不会评估为真。
这是我声明结构并创建数组的地方。
typedef struct ListStruct {
NodePtr first;
NodePtr last;
NodePtr current;
int numNodes;
} ListStruct;
typedef struct ListStruct* ListHndl
ListHndl* newHash(int size){
ListHndl* arr = malloc ( size*sizeof( ListHndl ));
for(int y = 0; y<size; y++){
arr[y] = NULL;
}
return arr;
}
然后我把它传递给像这样的函数
function(ListHndl* HashTable)
并将索引与null进行比较
if(HashTable[index] == NULL) {
//stuff that doesn't happen but should
}
这显示了一些使用该数组的函数。
void insert(int ID, char* title, int size, ListHndl* HashTable){
int index = hash(title, size);
if(HashTable == NULL ){
printf("can't insert hash table is null");
return;
}
//If the 'bucket' at the hashed index is empty, create a new list and initialize it appropriately
if(HashTable[index] == NULL){
//Do stuff, this doesn't get called even though it should
}else{
//do other stuff, this shouldn't be done when the function is called the first time but does in this case
}
这是测试程序。它在第一次插入时崩溃。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "list.h"
#include "hash.h"
int main(){
ListHndl temp = newHash(5);
printf("new hash created!\n");
insert(1, "munches", 5, temp);
printf("insertion has occurred! :)\n");
insert(2, "aids", 5, temp);
insert(3, "loki", 5, temp);
insert(4, "kelp", 5, temp);
insert(5, "kelp", 5, temp);
printf("insertion has occured!\n");
lookup(&temp, "munches", 5);
lookup(&temp, "aids", 5);
lookup(&temp, "loki", 5);
lookup(&temp, "kelp", 5);
printf("WE LIVE!\n");
return 0;
}
这是用于获取哈希表索引的哈希函数。
int hash (const char* word, int size)
{
unsigned int hash = 0;
for (int i = 0 ; word[i] != '\0' ; i++)
{
hash = 31*hash + word[i];
}
return hash % size;
}
答案 0 :(得分:2)
您的代码包含许多明显的错误,这些错误最有可能导致您的问题。函数newHash
被声明为返回ListHndl*
值
ListHndl* newHash(int size)
然而,在main
中,您使用它就像它返回ListHndl
值
ListHndl temp = newHash(5);
这没有任何意义,肯定会从编译器产生诊断消息(关于指针类型不匹配的事情)。您显然忽略了这些诊断消息并且无论如何都运行了该程序。
稍后在代码中,您再次将temp
值(类型为ListHndl
)传递给可能期望ListHndl *
个参数的函数。这肯定会从编译器生成诊断消息,您也忽略了它们。
不要忽略诊断消息。修复代码中的问题(错误和警告)。从那里继续。由于这些错误,你现在拥有的东西是没有意义的。