C 哈希表实现错误访问错误
我试图为我的项目创建一个哈希表,但我一直遇到错误的访问错误。正如编译器告诉我的,语法上并没有错误。我想我在内存分配上犯了一个错误,但我看不出来。感谢您的帮助 我在此循环中遇到错误的访问错误:C 哈希表实现错误访问错误,c,hashtable,C,Hashtable,我试图为我的项目创建一个哈希表,但我一直遇到错误的访问错误。正如编译器告诉我的,语法上并没有错误。我想我在内存分配上犯了一个错误,但我看不出来。感谢您的帮助 我在此循环中遇到错误的访问错误: hash_itself_p hash_table = (hash_itself_p)malloc(sizeof(hash_itself_t)); for (i = 0; i < 50; i++) { hash_table->data_id[i]->id = -1; // EXC_B
hash_itself_p hash_table = (hash_itself_p)malloc(sizeof(hash_itself_t));
for (i = 0; i < 50; i++)
{
hash_table->data_id[i]->id = -1; // EXC_BAD_ACCESS here
}
hash_self_p hash_table=(hash_self_p)malloc(sizeof(hash_self_t));
对于(i=0;i<50;i++)
{
hash\u table->data\u id[i]->id=-1;//这里的EXC\u BAD\u访问
}
以下是所有代码:
#include <stdio.h>
#include <stdlib.h>
#define size 50
typedef struct hash_value
{
int id;
int data;
int key;
} hash_values_t[1], *hash_values;
typedef struct hash_itself
{
hash_values data_id[size];
} hash_itself_t[1], *hash_itself_p;
int hash_key(int n)
{
return ( n*n + 2*n ) % size;
}
int hash_id(int n)
{
return n % size;
}
void insert(hash_itself_p hash_table, int person)
{
int id;
int key;
key = hash_key(person);
id = hash_id(key);
if (hash_table->data_id[id]->id == -1)
{
hash_table->data_id[id]->id = id;
hash_table->data_id[id]->data = person;
}
else
{
int block = id;
while (hash_table->data_id[block%50]->id != -1)
{
block++;
if (block%50 == id) return;
}
hash_table->data_id[block]->id = id;
hash_table->data_id[block]->data = person;
}
}
void display(hash_itself_p hash_table)
{
int i;
for (i = 0; i < size; i++)
{
printf("id = %d, data = %d, key = %d \n", hash_table->data_id[i]->id, hash_table->data_id[i]->data, hash_table->data_id[i]->key);
}
}
int main()
{
int i;
hash_itself_p hash_table = (hash_itself_p)malloc(sizeof(hash_itself_t));
for (i = 0; i < 50; i++)
{
hash_table->data_id[i]->id = -1;
}
insert(hash_table, 30);
display(hash_table);
}
#包括
#包括
#定义尺寸50
typedef结构哈希值
{
int-id;
int数据;
int键;
}哈希值\u t[1],*哈希值;
typedef结构哈希_本身
{
散列值数据id[大小];
}哈希本身\u t[1],*哈希本身\u p;
整数散列_键(整数n)
{
返回(n*n+2*n)%大小;
}
整数哈希_id(整数n)
{
返回n%大小;
}
void insert(散列表本身,int person)
{
int-id;
int键;
key=hash_key(person);
id=散列\u id(键);
如果(哈希表->数据\u id[id]->id=-1)
{
哈希表->数据\u id[id]->id=id;
哈希表->数据\u id[id]->data=person;
}
其他的
{
int block=id;
while(哈希表->数据\u id[块%50]->id!=-1)
{
block++;
if(块%50==id)返回;
}
哈希表->数据\u id[块]->id=id;
哈希表->数据id[块]->数据=人;
}
}
无效显示(哈希表本身\u p哈希表)
{
int i;
对于(i=0;i数据id[i]->id,哈希表->数据id[i]->data,哈希表->数据id[i]->key);
}
}
int main()
{
int i;
hash_本身\u p hash_table=(hash_本身\u p)malloc(sizeof(hash_本身\u t));
对于(i=0;i<50;i++)
{
哈希表->数据\u id[i]->id=-1;
}
插入(哈希表,30);
显示(哈希表);
}
您已将散列\u本身中的数据\u id
数组声明为指向散列\u值
结构的指针数组。由于这些指针没有初始化,它访问无效内存
我认为您希望直接创建一个结构数组,在这种情况下,您需要:
typedef struct hash_itself
{
hash_values_t data_id[size];
}
非常感谢你。我应该更加小心。