0

約 500 エントリと言うと、このリンク リストのコード セグメントに障害が発生します。

while (item_temp->next != 0) {

ループ内では、リンクされたリストの次の項目に移動するだけです。

gdbで見ると、次のようになります

(gdb) print item_temp
$1 = (struct item *) 0xc
(gdb) print item_temp->next
Cannot access memory at address 0xc

編集:

私はそれを次のように割り当てます:

struct item* item_temp = malloc(sizeof(struct item));

そして、ループの直前に、次のようにリンクされたリストの先頭に等しく設定しました

    item_temp = table->buckets[code]->head;

そして、それを知らせるために、頭を参照する前に、頭が存在することを確認します。私はそのようにします。

if (table->buckets[code]->head == 0)
{
    table->buckets[code]->head = item_add;
    table->occupied_buckets++;
}

これが私のコードのサンプルです...他に何か必要な場合は、お問い合わせください。

struct HT* add(struct HT* table, struct word *wrd, int(*alg)(struct word *wrd)) 
{
if ((double)table->entries / (double)table->num_buckets > .75)
{
    table = resize(table, alg);
}   
sort(wrd);
int code = alg(wrd);
code = code % table->num_buckets;
struct item* item_temp = malloc(sizeof(struct item));
struct item* item_add = malloc(sizeof(struct item));
item_add->wrd = wrd;
item_add->next = 0; 
if (table->buckets[code]->head == 0)
{
    table->buckets[code]->head = item_add;
    table->occupied_buckets++;
}
else
{
    item_temp = table->buckets[code]->head;
    while (item_temp->next != 0) {
        item_temp = item_temp->next;
    }
    item_temp->next = item_add;
}
table->buckets[code]->num_items++;
table->entries++;
if (table->buckets[code]->num_items > table->largest_bucket)
{
    table->largest_bucket = table->buckets[code]->num_items;
}
return table;
   }
4

1 に答える 1

1

item_tempあなたの質問から、それが場所を指していて0xc、逆参照nextによってコードが無効なアドレスにアクセスし、セグメンテーション違反が発生していることは明らかです。

item_temp = table->buckets[code]->head;に評価されてい0xcます。

于 2013-04-08T15:05:40.097 に答える