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


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.