我正在尝试使用数组作为哈希表,每个数组都会引用它自己的链表
大小是检查链表的节点数是否为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;
}
答案 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的原因没有直接关系):
first = (NODE *)malloc(sizeof(NODE));
0x0是malloc的有效返回值之一。几乎总是我喜欢在malloc调用后进行if检查。类似地,对于其他可以返回null ptr的api调用
您已声明NODE* array[312500];
,但x的值最高可达312500,因此您最终可能会访问未定义行为的数组[312500]。 (通常通过覆盖堆栈上其他变量的值来导致内存损坏)