将结构数组的索引与NULL进行比较,而不是求值为true;

时间:2014-05-23 05:54:22

标签: c arrays if-statement struct null

我有一个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;
}

1 个答案:

答案 0 :(得分:2)

您的代码包含许多明显的错误,这些错误最有可能导致您的问题。函数newHash被声明为返回ListHndl*

ListHndl* newHash(int size)

然而,在main中,您使用它就像它返回ListHndl

一样
ListHndl temp = newHash(5);

这没有任何意义,肯定会从编译器产生诊断消息(关于指针类型不匹配的事情)。您显然忽略了这些诊断消息并且无论如何都运行了该程序。

稍后在代码中,您再次将temp值(类型为ListHndl)传递给可能期望ListHndl *个参数的函数。这肯定会从编译器生成诊断消息,您也忽略了它们。

不要忽略诊断消息。修复代码中的问题(错误和警告)。从那里继续。由于这些错误,你现在拥有的东西是没有意义的。