【问题标题】:Array structure not working correctly数组结构无法正常工作
【发布时间】:2013-12-13 21:04:11
【问题描述】:

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

这会构建数组

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.index 索引的。然后我将 K 添加到索引的键中。当这条线出现在我的程序中的任何地方时,我都会得到一个段错误。

你能看出我在这里做错了什么吗?

【问题讨论】:

  • 那么,您是否为table 数组分配了内存?然后你是否为从table 元素指向的每个list_t 对象分配了内存?你必须向我们展示你是如何做到的。
  • 不知道你是如何在table 中分配项目的,这将很难提供帮助......
  • 我现在就添加我的构造函数。
  • 到目前为止,您还没有显示 hash-&gt;table[i] 被设置为除 NULL 之外的任何内容...
  • 我在行的地方添加了。我第一次尝试时项目为 0

标签: c hash struct segmentation-fault


【解决方案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;
   }

【讨论】:

  • 非常感谢。我可以将该行添加到我的构造函数中吗?
  • 这条线段也有问题。
【解决方案2】:

根据您在table_construct 函数中发布的内容,table 数组的元素是空指针。不允许您通过空指针执行任何类型的访问。

这根本没有意义

   if(hash->table[item] == NULL)
   {
        hash->table[item]->K = K;
        hash->table[item]->I = I;
        return 0;
   }

在这里,您明确尝试通过空指针写入数据。

在尝试通过该指针访问任何内容(写入或读取)之前,您必须确保指针指向有效对象。

【讨论】:

  • 好的,如果我删除使它们全部为 NULL 的行,那会更有意义吗?
  • @user081608:仅删除该行将无济于事。您必须使这些指针指向有意义的地方。您必须创建这些指针将指向的对象。这里想到的问题是,如果您不知道这些指针应该指向哪里,为什么要将 table 设为 pointers 数组?为什么不将其设为 list_t 对象数组而不是指针?
  • 对不起,我在做这个功能时可能只是把自己弄糊涂了。我的 malloc 是否为桌子大小腾出空间。然后应该分配 table[0-n]。我想我的意思是让行 hash->table[i]->K = 0。让所有的键 = 0。但即便如此,你说我需要让每个数组指向某个地方?
  • @user081608:您的malloc 为表本身分配内存。但是您决定将您的 list_t 对象存储在该表的外部,即您的表由 指针 指向存储在其他地方的list_t 对象。您的 malloc 没有为这些 list_t 对象分配内存(它会怎样?)。而且你永远不会创建那些 list_t 对象。
  • 哦,所以我必须为 K 和 I 分配内存?
【解决方案3】:

在你的函数table_construct中,当你malloc hash->table时,你应该这样做。

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));
}

如果你想这样做的话,你就这样做了。

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

【讨论】:

  • 谢谢。但是中间的说法是什么意思呢?
  • 用 0 填充内存块。
猜你喜欢
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多