使用数组作为hashTables

时间:2013-11-12 18:25:31

标签: c arrays indexing hashtable

我正在尝试使用数组作为哈希表,每个数组都会引用它自己的链表

大小是检查链表的节点数是否为32。

我的问题是我得到了分段错误,但是我的指针中看不到任何错误,这里是完整的代码。

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


typedef int bool;
enum { false, true };

void main(int argc, char *argv[])
{
// create linked list---------------------------
    struct node
    {
        int num;
        struct node *ptr;
    };

    typedef struct node NODE;



    NODE *first, *last, *temp, *newNode=0 ;

    int count = 0;

    first = NULL;
    last=NULL;
    temp=NULL;
    newNode=0;

//-----------------------------------------------------------------------

//filling the text file with billions of integers------------------------------------------------
    FILE *f = fopen("file.txt", "w");
    if (f == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }

    int i = 0;

    unsigned long long randomvalue;

    for (i = 0; i < 10000000; i++)
    {
        randomvalue = random();
        randomvalue <<= 16; // just picked 16 at random
        randomvalue ^= random();  // you could also use + but not "or";
        randomvalue %= 10000000000ULL;
        fprintf(f,"%lld \n",randomvalue);
    }
    fclose(f);

   NODE* array[312500];

    first  = (NODE *)malloc(sizeof(NODE));
    last= (NODE *)malloc(sizeof(NODE));
    temp = (NODE *)malloc(sizeof(NODE));
newNode = (NODE *)malloc(sizeof(NODE));
    FILE *file = fopen ("file.txt", "r");


   int x=0;
   for ( x=0; x<=312500; x++)
     {
          while (count <=32)
        {

             fscanf (file, "%d", &temp->num);  

temp->ptr=NULL;



   newNode->num=temp->num;
   newNode->ptr=NULL;



               if (first != 0)

           {

            last->ptr=newNode;
            last=newNode;
            count=count+1;

           }
          else

          {

             first = newNode;
             last = newNode;
             count=count+1;
           }

               fflush(stdin);
            newNode->ptr=0;
            newNode=NULL;



       }

          count =0;
          array[x]->ptr=first;

         first->ptr=0;
         first=NULL;

         last->ptr=0;
         last=NULL;


        }


 fclose (file); 
temp->ptr = 0;  
temp=NULL;
}

1 个答案:

答案 0 :(得分:1)

根据gdb:

  

编程接收信号SIGSEGV,分段故障。 0x00401618 in   在tryy.c上的main(argc = 1,argv = 0x8d0ce0):77 77
  newNode-&GT; NUM = TEMP-&GT; NUM;

     

(gdb)p newNode

  $10 = (NODE *) 0x0

所以你得到一个SIGSEGV,因为你试图访问0x0的内存。 我在你的代码中看到的问题(它们可能与newNode变为NULL的原因没有直接关系):

  1. first = (NODE *)malloc(sizeof(NODE)); 0x0是malloc的有效返回值之一。几乎总是我喜欢在malloc调用后进行if检查。类似地,对于其他可以返回null ptr的api调用

  2. 您已声明NODE* array[312500];,但x的值最高可达312500,因此您最终可能会访问未定义行为的数组[312500]。 (通常通过覆盖堆栈上其他变量的值来导致内存损坏)