1

私は次のような2つの構造を持っています:

struct item2_map{
char stringkey[MAX_SIZE];
UT_hash_handle hh;
}

struct item1_map{
int key1;
struct item2_map *item2_map;
UT_hash_handle hh;
}

私のコードでは、私はこのようなことをします

struct item1_map *retrieved;
struct item2_map *found_value, *tmp;

HASH_FIND(hh, hash_head, key1, &someintvalue, sizeof(int), retrieved)
if(retrieved==NULL)
{
    HASH_ADD(hh, hash_head, key1, sizeof(key1), my_item1);
    my_item1->item2_map = NULL;
    HASH_ADD_STR(my_item1->item2_map, stringkey, my_item2);
} else 
{
    //THIS WORKS
    HASH_ITER(hh, retrieved->item2_map, found_value, tmp)
    { //do something }

    //THIS SEG FAULTS
    HASH_FIND_STR(retrieved->item2_map, &my_item2->stringkey, found_value)
}

これにより、HASH_FIND_STR() でセグ フォールトが発生するようです。私が間違っていることはありますか?この例では、my_item1 と my_item2 は別の場所から取得され、有効であると想定しています。値を見つけるためのキーとして stringkey を使用したいと思います。

条件の部分にブレークポイントを置いたIFので、最初は見つからないことがわかり、そのキーの2番目の検索でelseブロックが入力されます。

興味深いことに、HASH_ITER を使用してエントリを反復処理すると、少なくともクラッシュすることなく「機能する」ように見えますが、すべての値が同じであるとは確信していません。

4

1 に答える 1

3

基本的に正しいようです。再確認すべきいくつかのこと

  • my_item1->item2_map が my_item1 の作成時に HASH_ADD_STR の前に NULL に初期化されていることを確認します
  • my_item2->stringkey が null で終了し、HASH_FIND_STR の前に MAX_SIZE 未満であることを確認してください
  • valgrind の下で実行してみて、他の手がかりがあるかどうかを確認してください

何か見つけたらお知らせください。

トロイ

于 2013-04-10T03:49:06.023 に答える