「構造体または共用体ではないものでのメンバー '*******'の要求」とはどういう意味ですか?


83

このエラーの意味について簡単な説明はありますか?

Cを学んでいる間に何度か遭遇しましたが、それが何を意味するのかわかりません。


より良い答えはトップに受け入れられるべきです。
T.Woody 2014年

回答:


117

また、ポインタがあるときにインスタンスにアクセスしようとした場合、またはその逆の場合にも発生します。

コメントで指摘されているように、誰かがtypedefポインタを移動した場合、つまり*、次のようにtypedefにを含めると、これは耐え難いものになる可能性があります。

なぜなら、実際にはポインタを扱っているのに、インスタンスを扱っているように見えるコードを取得するからです。

上記がどのように書かれるべきであるかに注意してくださいa_foo.field、しかしそれはFoostructへのポインタなので失敗するでしょう。Cの:edポインタは使用しないことを強くお勧め typedefます。ポインタは重要です。アスタリスクを非表示にしないでください。それらを輝かせてください。


8
これが実際の問題だと思います。特に誰かがポインタ型をtypedefした場合、それはまだ時々私を噛みます。
John Bode 2010

2
配列が割り当てられておらず(malloc)、アクセスされた場合にこのエラーが表示されることを付け加えておきます。
最大

これが投稿されてから約10年以上経っていますが、最後の2文でこれが私の新しいお気に入りの投稿になりました。「ポインタは重要です。アスタリスクを隠さないでください。それらを輝かせてください。」
Aiden BlishenCuneo20年


6

次の場合にも発生する可能性があります。

例えば。スタックのプッシュ機能を考えると:

エラーはプッシュ機能とコメント行にあります。ポインタsは括弧内に含める必要があります。正しいコード:


2
ポインタポイント(言語にひどい遊びはありません)を明示していただきありがとうございます。他の回答はそれについて言及しました(たとえば、「ポインタを輝かせてください」)が、午前2時に、GDBとValgrindとの壮大な戦いで苦労しているとき、私のような人々は、あなたの回答がポインタが問題になる方法とその問題を修正する方法を明示的に示していることを高く評価しています。
マックスフォンヒッペル2016年

3

このエラーがコードで発生する可能性のあるすべてのケースとそのコメントを以下に列挙しました。さらに多くのケースに遭遇した場合は、それに追加してください。

根底にある考えはまっすぐです:

  • .構造変数とともに使用します。(ケース2および4)
  • ->構造体へのポインタとともに使用します。(ケース1および3)
  • 次のポインタを使用して構造体変数または構造体変数へのポインタに到達した場合は、ポインタを角かっこで囲みます:(*ptr).and (*ptr)->vs *ptr.and *ptr-> (ケース1を除くすべてのケース)
  • 次のポインタを使用して到達している場合は、structまたはstructのいずれか目的のポインタに正しく到達していることを確認してください。(ケース5、特に5.5)

1

この構造体/共用体を定義するヘッダーファイルをインクルードし忘れたことを意味する場合があります。例えば:

foo.hファイル:

main.cファイル:


0

次の場合にも表示されます。

の代わりに


これらの2つのステートメントの間に違いはありませんか?
Nick Predey 2016

1
@AlaaM。数か月後のことを振り返ると、セミコロンを見逃しました。
Nick Predey 2016年

0

メンバーにアクセスしようとしたときに見ました。

私の構造体はこれでした:

通常、構造体メンバーには次のようにアクセスします

testvarをポインターと間違えて、これを行いました。

その時、私はこのエラーを見ました。

構造体または共用体ではないものでのメンバー「a」の要求

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.