Що означає "прохання про членство" ******* "у чомусь, що не є структурою чи об'єднанням"?


83

Чи є просте пояснення того, що означає ця помилка?

Я стикався з цим кілька разів за час, коли вивчав C, але я не маю уявлення про те, що це означає.


Краща відповідь повинна бути прийнята вгорі.
T.Woody

Відповіді:


117

Це також трапляється, якщо ви намагаєтеся отримати доступ до екземпляра, коли у вас є вказівник, і навпаки:

Як зазначалося в коментарі, це може бути нестерпним, якщо хтось йде і typedefвказує покажчик, тобто включає *in в typedef, приблизно так:

Тому що тоді ви отримуєте код, схожий на те, що він має справу з екземплярами, а насправді має справу з покажчиками:

Зверніть увагу, як вище виглядає так, ніби це слід написати a_foo.field, але це не вдасться, оскільки Fooє вказівником на struct. Я настійно рекомендую проти typedef : Ed покажчики в C. Покажчики є важливими, не приховують свої зірочки. Нехай сяють.


8
Б'юся об заклад, це справжня проблема. Це все одно мене кусає зрідка, особливо якщо хтось ввів typedef'd тип вказівника.
Джон Боде

2
Я просто додам, що ця помилка з'явиться, якщо масив не був виділений (malloc) і доступ до нього.
максимум

Я знаю, що з моменту публікації минуло близько десяти років чи більше, але ці два останні речення зробили це моє нове улюблене повідомлення. "Покажчики важливі, не ховайте свої зірочки. Нехай вони сяють".
Aiden Blishen Cuneo

20

Ви намагаєтесь отримати доступ до члена структури, але в чомусь, що не є структурою. Наприклад:


6

Це також може статися в наступному випадку:

напр. якщо розглядати функцію push стека:

Помилка полягає у функції push та у коментованому рядку. Покажчик sповинен бути включений до дужок. Правильний код:


2
Дякуємо, що чітко вказали вказівник (без жахливої ​​гри на мові). Інші відповіді згадували про це (наприклад, "нехай ваші вказівники світять"), але о 02:00, бившись в епічній битві з GDB і Вальгріндом, люди, такі як я, цінують, що ваша відповідь чітко показує, як вказівник може бути проблемою і як цю проблему можна виправити .
Макс фон Гіппель,

3

Я перелічив, можливо, усі випадки, коли ця помилка може трапитися в коді та коментарі нижче. Будь ласка, додайте до нього, якщо натрапите на більше справ.

Основні ідеї прямі:

  • Використовувати .зі змінною структури. (Випадки 2 і 4)
  • Використовувати ->з вказівником на структуру. (Випадки 1 і 3)
  • Якщо ви досягли змінної структури або покажчика на змінну структури, слідуючи вказівнику, тоді оберніть покажчик всередині дужки: (*ptr).і (*ptr)->vs *ptr.та *ptr-> (Усі випадки, крім випадку 1)
  • Якщо ви звертаєтесь за наступними вказівниками, переконайтесь, що ви правильно досягли покажчика на struct або struct, що завгодно. (Випадок 5, особливо 5.5)

1

Це може означати, що ви забули включити файл заголовка, який визначає цю структуру / об'єднання. Наприклад:

файл foo.h:

файл main.c:


0

також може з'явитися, якщо:

замість


Чи немає різниці між цими двома твердженнями?
Нік Преді

1
@AlaaM. озираючись на це через кілька місяців, я пропустив крапку з комою!
Нік Преді

0

Я це побачив, коли намагався отримати доступ до учасників.

Моя структура була такою:

Зазвичай ми отримуємо доступ до членів структури як

Я прийняв тествара за вказівника і зробив це.

Саме тоді я побачив цю помилку.

запит члена "а" у чомусь, що не є структурою чи об'єднанням

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.