2013-11-28 81 views
0

我有一个数组,其中包含数组中每个索引的键和信息。阵列结构无法正常工作

此生成阵列

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是一个数字。

所以这里发生的是,我有我的表索引项目。然后我将K添加到索引的关键字中。当我的程序中的任何地方出现这条线时,我会得到一个seg故障。

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

+0

那么,你是否为你的'table'数组分配内存?然后你是否为'table'元素指向的每个'list_t'对象分配内存?你必须告诉我们你是如何做到的。 – AnT

+0

不知道如何在'table'中分配项目,这将很难提供帮助... – John3136

+0

现在我添加我的构造函数。 – user081608

回答

0

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

而这只是没有任何意义

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

在这里你做出明确企图通过一个空指针写入数据。

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

+0

好吧,如果我删除了使它们全部为NULL的行,那会更有意义吗? – user081608

+0

@ user081608:只是删除该行将无济于事。你必须让这些指针指向某个有意义的地方。你必须*创建*这些指针将指向的对象。这里想到的问题是,如果你不知道这些指针应该指向哪里,为什么你把这个'table'作为一个*指针*的数组呢?你为什么不把它作为一个'list_t'对象而不是指针? – AnT

+0

对不起,我可能只是混淆了我自己做这个功能。我的malloc不会为桌子大小腾出空间。然后表[0-n]应该被分配。我认为我的意思是使行hash-> table [i] - > K = 0。使所有的键= 0.但即使如此,你说我需要使每个数组指向某处? – user081608

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

非常感谢。我可以将该行添加到我的构造函数中吗? – user081608

+0

另外这条线段故障。 – user081608

+0

没关系,我找到了它 – user081608

0

在你的函数table_construct,当你的malloc散列>表,你应该像做这个。

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

谢谢。但中间声明意味着什么? – user081608

+0

用0填充内存块。 – qdd