我有一个数组,其中包含数组中每个索引的键和信息。
这会构建数组
table_t *table_construct (int table_size, int probe_type)
{
int i;
table_t *hash;
if(table_size < 1) return NULL;
hash = malloc(sizeof(table_t));
hash->table = malloc(sizeof(list_t*) * table_size);
for(i=0; i < table_size - 1; i++)
{
hash->table[i] = NULL;
//hash->table[i]->next = NULL;
}
hash->size = table_size;
hash->probing_type = probe_type;
return hash;
}
所以我有list_t和table_t结构。我的代码中有以下行无法正常工作:
hash->table[item]->K = K;
在我的代码的这一部分可以看到:
int dec, item, hold;
item = hashing(hash,K);
hold = item;
if(hash->table[item] == NULL)
{
hash->table[item]->K = K;
hash->table[item]->I = I;
return 0;
}
当我GDB它时,K是一个数字。
所以这里发生的事情是,我有一个用item索引的表。然后我将K添加到索引的键中。当我的程序中的任何地方出现这一行时,我会得到一个seg错误。
你能看到我在这里做错了吗?
答案 0 :(得分:1)
您已验证指针为空,因此在您引用它之前,您需要为其指定一些内容:
if(hash->table[item] == NULL)
{
hash->table[item] = malloc(sizeof(list_t)); // you were missing this.
hash->table[item]->K = K;
hash->table[item]->I = I;
return 0;
}
答案 1 :(得分:0)
根据您在table_construct
函数中发布的内容,table
数组的元素是空指针。您不能通过空指针执行任何类型的访问。
这只是没有意义
if(hash->table[item] == NULL)
{
hash->table[item]->K = K;
hash->table[item]->I = I;
return 0;
}
在这里,您明确尝试通过空指针写入数据。
在尝试通过该指针访问任何内容(写入或读取)之前,必须确保指针指向有效对象。
答案 2 :(得分:0)
在你的函数table_construct中,当你使用malloc hash-&gt;表时,你应该这样做。
hash->table = (list_t **)malloc(sizeof(list_t*) * table_size);
for (i=0;i<table_size;i++)
{
hash->table[i] = (list_t *)malloc(sizeof(list_t));
}
如果您想这样做,那么你做的就是null。
memset(hash->table[i],0,sizeof(list_t));
然后你可以使用这个判断陈述。
if(hash->table[item] != NULL)
{
hash->table[item]->K = K;
hash->table[item]->I = I;
return 0;
}