0

私は2つの構造体AとBを持っています:

struct A {
 int v;
}

struct B {
 struct A* ptrs[MAX_PTRS];
}

基本的に、構造体 B の要素を構造体 A へのポインターの配列にしたい (MAX_PTRS は、ヘッダー ファイルで定義されるマクロです)。

ここで、グローバル変数があるとします。

struct B* sB;

何らかの理由で、次のコマンドを試してみると

int x = sB->ptrs[0]->v;

「'->' の型引数が無効です」というエラーが表示されます。

なにが問題ですか?(すべてが正しく初期化され、割り当てられていると仮定します)

4

2 に答える 2

1

通常は、このような質問に見られるように、ドット定義演算子 () を使用した場合にドット演算子 ()invalid type argument of '->'を使用する必要があることを意味します。.->

あなたのコードでは、あなたが行った場合、これを見ることができます:

struct A {
 int v;
};

struct B {
 struct A ptrs[MAX_PTRS];  // note the missing *
};

この欠落*により、表示されているエラーが発生します。error: invalid type argument of ‘->’ (have ‘struct A’)

すべてが本当に初期化され、正しく割り当てられている場合、問題はないはずです。次の例を参照してください。

#define MAX_PTRS 3

struct A {
 int v;
};

struct B {
 struct A ptrs[MAX_PTRS];
};

int main (int argc, char *argv[]) {
    struct B *sB = malloc(sizeof(struct B));
    sB->ptrs[0] = malloc(sizeof(struct A));
    sB->ptrs[0]->v = 10;
    int x = sB->ptrs[0]->v;
    printf("%d\n", x);
    return 0;
}
于 2013-03-27T03:50:49.010 に答える
0

構造体は;、すべての右括弧の後に記号を付ける必要があります..

コードに問題はありません

struct B* sB;

int x = sB->ptrs[0]->v;

ただし、sB を初期化する必要があります。

于 2013-03-27T05:49:05.003 に答える