数组结构无法正常工作

时间:2013-11-28 00:34:53

标签: c hash struct segmentation-fault

我有一个数组,其中包含数组中每个索引的键和信息。

这会构建数组

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错误。

你能看到我在这里做错了吗?

3 个答案:

答案 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;
}