1

hfun構造体内に保持されている関数へのポインターを使用して関数を呼び出そうとしています。

これらは型定義です:

typedef struct Table* TableP;
typedef struct Object* ObjectP;
typedef int(*HashFcn)(const void *key, size_t tableSize);
typedef struct Object {
    void *key;
    ObjectLink *top;
} Object;

typedef struct Table{
    ObjectLink *linkedObjects;
    size_t size, originalSize;
    HashFcn hfun;
    PrintFcn pfun;
    ComparisonFcn fcomp;
} Table;

そして、ここで私は電話をかけようとしていますが、メモリ不足の場所にアクセスしようとしているというエラーが表示されます:

Boolean InsertObject(TableP table, ObjectP object)
{

    int i = (*table->hfun)(object->key, table->size);
    if (table->linkedObjects[i].key == NULL)
    {
        table->linkedObjects[i].key = object;
    } else
    {
        table->linkedObjects[i].next->key = object;
    }

    return TRUE;
}

Eclipse デバッガーを使用すると、呼び出しの時点で変数の値が次のようになっていることがわかります。

object->keyタイプvoid*0x804c018
table->size タイプsize_t1

これは、関数へのポインターを呼び出す方法ではないと思います。ここで何が問題なのですか?

編集:

デバッグで私も見ることができます: *table->hfuntype int(const void *,size_t) table->hfuntype HashFcnvalue0x11

4

1 に答える 1

7

あなたはそれを正しい方法で呼んでいません。

関数ポインターには、他の関数と同じようにアクセスできます。

table->hfun(object->key, table->size)

hfun[編集] そうですね、適切に割り当てることも確認してください:

int myFunc(const void* key, size_t tableSize) { }

table->hfun = &myFunc;
于 2012-12-25T10:07:30.947 に答える