链接列表::哈希表:: Valgrind错误::条件跳转或移动取决于未初始化的值

时间:2015-03-21 21:11:13

标签: c linked-list hashtable

再次需要帮助。

我的链表工作正常。它将文件中的单词列表复制到链接列表中。

现在我想制作一个哈希表,以便所有以字母'A'开头的单词进入链表的存储区[0]。

我写的代码;它似乎适用于小型和大型列表,但Valgrind显示出错误。

-----CODE-----
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct node     //struct for linked list
{
    char* word;
    struct node* next;
}
node;

int findhash(char firstletter)      //this function returns a hash value for first alphabet of every word
{
    int hash = 0;

    if(isupper(firstletter))
        hash = firstletter-'A';
    else hash = firstletter-'a';

    return hash;       
}

int main (void)
{            
    char* dictfile = "small";

    FILE* dict = fopen(dictfile, "r");

    if (dict == NULL)
        return 1;

    char oneword[47];      //to store the word from fscanf()

    node* hashtable [30];       //creates a hashtable        

    for (int i = 0; i < 30; i++)        //gives an index to every element in the hash table
    {
        node* temp = (node*)malloc(sizeof(node));
        temp->next = NULL;           
        hashtable[i] = temp;
    } 

    while ((fscanf (dict, "%s", oneword)) > 0)
    {                                        
        node* temp = (node*)malloc(sizeof(node));            
        char* tempword = (char*)malloc(strlen(oneword)+1); //gives me a new pointer to store the string (as pointed out by Antione)            
        strcpy(tempword, oneword);

        char firstletter = tempword[0];

        int hash = 0;
        hash = findhash(firstletter);      //returns an index for the first alphabet of the word                  
        temp->word = tempword;

        //printf("%s\n", temp->word);     //prints the value (just for debug)

        temp->next = hashtable[hash];            
        hashtable[hash] = temp;             
    }

    for (int i = 0; i < 30; i++)
    {           
        node* temp = (node*)malloc(sizeof(node));
        temp = hashtable[i];
        while (temp != NULL)    //loop to print the linked list 
        {           
            if (temp->word != NULL)    //**THIS IS WHERE VALGRIND IS POINTING THE ERROR TO BE**
            {
                printf("%s\n", temp->word);
                temp = temp->next;
            }
            else break;
        }   
    }

    printf("\n");
    fclose(dict);

    printf("SUCCESS!!\n");      

}    

我哪里错了?请帮忙

    -----VALGRIND ERROR-----
    jharvard@appliance (~/Dropbox/pset5): valgrind ./tempeol
==11035== Memcheck, a memory error detector
==11035== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==11035== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==11035== Command: ./tempeol
==11035== 
antione
==11035== Conditional jump or move depends on uninitialised value(s)
==11035==    at 0x80488CA: main (tempeol.c:68)
==11035== 
beer
bear
caterpillar
cat
google
root

SUCCESS!!
==11035== 
==11035== HEAP SUMMARY:
==11035==     in use at exit: 582 bytes in 74 blocks
==11035==   total heap usage: 75 allocs, 1 frees, 934 bytes allocated
==11035== 
==11035== LEAK SUMMARY:
==11035==    definitely lost: 480 bytes in 60 blocks
==11035==    indirectly lost: 102 bytes in 14 blocks
==11035==      possibly lost: 0 bytes in 0 blocks
==11035==    still reachable: 0 bytes in 0 blocks
==11035==         suppressed: 0 bytes in 0 blocks
==11035== Rerun with --leak-check=full to see details of leaked memory
==11035== 
==11035== For counts of detected and suppressed errors, rerun with: -v
==11035== Use --track-origins=yes to see where uninitialised values come from
==11035== ERROR SUMMARY: 30 errors from 1 contexts (suppressed: 0 from 0)

Valgrind显示30个错误。我的哈希表是大小30.所以觉得问题应该在某处。但我无法弄清楚为什么?

1 个答案:

答案 0 :(得分:0)

您对哈希表条目的初始化没有初始化字段word,这正是valgrind所抱怨的。

此外,您的代码似乎还有其他问题。例如,前一行中的malloc被立即覆盖,因此这个内存泄漏。此外,malloc的归还不应该被投射。尽可能避免施放,将施法视为“施放咒语”。只要你不知道那是做什么,就避免它。