Co oznacza „prośba o członkostwo„ ******* ”w czymś, co nie jest strukturą lub związkiem”?

83

Czy istnieje proste wyjaśnienie, co oznacza ten błąd?

Napotkałem to kilka razy w czasie, gdy uczyłem się C, ale nie mam pojęcia, co to znaczy.

Pieter
źródło
Lepszą odpowiedź należy przyjąć na górę.
T.Woody

Odpowiedzi:

117

Dzieje się tak również, jeśli próbujesz uzyskać dostęp do instancji, gdy masz wskaźnik, i odwrotnie:

Jak wskazano w komentarzu, może to być rozdzierające, jeśli ktoś pójdzie i typedefsa pointer, tj. *Włączy w typedef, na przykład:

Ponieważ wtedy otrzymujesz kod, który wygląda tak, jakby zajmował się instancjami, podczas gdy w rzeczywistości ma do czynienia ze wskaźnikami:

Zwróć uwagę, jak powyższe wygląda, jakby powinno być napisane a_foo.field, ale to się nie powiedzie, ponieważ Foojest wskaźnikiem do struktury. Gorąco polecam przeciwko typedef : Ed wskaźniki w C Wskaźniki są ważne, nie ukrywają swoje gwiazdki. Niech lśnią.

rozwijać
źródło
8
Założę się, że to jest rzeczywisty problem. Nadal czasami mnie gryzie, zwłaszcza jeśli ktoś wpisał typ wskaźnika.
John Bode
2
Dodam tylko, że ten błąd pojawi się, jeśli tablica nie została przydzielona (malloc) i jest dostępna.
max
Wiem, że od opublikowania tego artykułu minęło około dziesięciu lat, ale te dwa ostatnie zdania sprawiły, że stał się moim nowym ulubionym postem. „Wskaźniki są ważne, nie ukrywaj gwiazdek. Niech świecą”.
Aiden Blishen Cuneo
20

Próbujesz uzyskać dostęp do elementu struktury, ale w czymś, co nie jest strukturą. Na przykład:

Thomas Padron-McCarthy
źródło
6

Może się to również zdarzyć w następującym przypadku:

na przykład. jeśli weźmiemy pod uwagę funkcję push stosu:

Błąd występuje w funkcji push oraz w skomentowanej linii. Wskaźnik smusi znajdować się w nawiasach. Prawidłowy kod:

Kaustav Ray
źródło
2
Dziękuję za wyraźne wskazanie punktu wskaźnika (bez strasznej gry językowej). Inne odpowiedzi wspominały o tym (np. „Niech świecą wskaźniki”), ale o 2 w nocy walcząc w epickiej bitwie z GDB i Valgrind, ludzie tacy jak ja doceniają, że Twoja odpowiedź wyraźnie pokazuje, w jaki sposób wskaźnik może być problemem i jak można go naprawić .
Max von Hippel
3

Wymieniłem prawdopodobnie wszystkie przypadki, w których ten błąd może wystąpić w kodzie i jego komentarzach poniżej. Dodaj do tego, jeśli napotkasz więcej przypadków.

Podstawowe pomysły są proste:

  • Użyj .ze zmienną strukturalną. (Przypadki 2 i 4)
  • Używaj ->ze wskaźnikiem do struktury. (Przypadki 1 i 3)
  • Jeśli osiągniesz zmienną strukturalną lub wskaźnik do zmiennej struktury, podążając za wskaźnikiem, a następnie zawiń wskaźnik w nawias: (*ptr).i (*ptr)->vs *ptr.i *ptr-> (Wszystkie przypadki z wyjątkiem przypadku 1)
  • Jeśli osiągasz przez następujące wskaźniki, upewnij się, że poprawnie osiągnąłeś wskaźnik do struct lub struct, w zależności od tego, co jest pożądane. (Przypadek 5, zwłaszcza 5.5)
Mahesha999
źródło
1

Może to oznaczać, że zapomniałeś dołączyć pliku nagłówkowego, który definiuje tę strukturę / unię. Na przykład:

plik foo.h:

plik main.c:

Magnetostrykcja
źródło
0

może się również pojawić, jeśli:

zamiast

Nahum
źródło
Nie ma różnicy między tymi dwoma stwierdzeniami?
Nick Predey
1
@AlaaM. Patrząc na to kilka miesięcy później, przegapiłem średniki!
Nick Predey
0

Widziałem to, kiedy próbowałem uzyskać dostęp do członków.

Moja struktura była następująca:

Zwykle uzyskujemy dostęp do członków struktury jako

Pomylili ja testVar się wskaźnik i to zrobił.

Wtedy zobaczyłem ten błąd.

żądanie członka „a” w czymś, co nie jest strukturą ani związkiem

mozaika
źródło