2

table構造体型の配列を保持する(構造体)にオブジェクトを挿入しようとすると、このメッセージが表示されますObjectLink。構造体:

typedef struct ObjectLink {
    void *key;
    struct Object *next;
} ObjectLink;

typedef struct Object {
    void *key;
    ObjectLink *top;
} Object;

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

失敗しているコード(すべての割り当てとifステートメント):

Boolean InsertObject(TableP table, ObjectP object)
{

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

    return TRUE;
}

以前の質問で検索しましたが、役に立ちませんでした。ここで何が問題になっていますか?

4

2 に答える 2

4

linkedObjectsはポインタであるためlinkedObjects[i]、オブジェクト自体です。演算子は->ポインターに対してのみ機能します。がある場合は、フィールド アクセスstructに通常のドット演算子を使用する必要があります。.

table->linkedObjects[i].key = object;
//                     ^--- Here
于 2012-12-24T14:25:21.507 に答える
3

配列添字演算子[]は次のように定義されますE1[E2] == *((E1)+(E2))。では->、存在しないポインターを逆参照しようとしています (既に operator でポインターを逆参照しているため[])。したがって、正しい解決策は次のとおりです。

table->linkedObjects[i].next->key = object;

それ以外の:

table->linkedObjects[i]->next->key = object;

linkedObjects[i]タイプObjectLinkであり、逆参照する必要はありません。

于 2012-12-24T14:25:32.143 に答える