“Bir yapı veya sendika olmayan bir şeyde '*******' üye talebi” ne anlama geliyor?


83

Bu hatanın ne anlama geldiğine dair kolay bir açıklama var mı?

C'yi öğrenirken birkaç kez karşılaştım ama ne anlama geldiğine dair bir fikrim yok.


Daha iyi cevap en üstte kabul edilmelidir.
T.Woody

Yanıtlar:


117

Bir işaretçiniz varken bir örneğe erişmeye çalıştığınızda da olur ve bunun tersi de geçerlidir:

Bir yorumda belirtildiği gibi, eğer birisi gidip bir typedefişaretçi ise, yani *bir typedef'i içeriyorsa , bu durum dayanılmaz hale gelebilir :

Çünkü o zaman örneklerle ilgileniyormuş gibi görünen bir kod alırsınız , aslında bu işaretçilerle ilgileniyor:

Yukarıdakilerin nasıl yazılması gerekiyormuş gibi göründüğüne dikkat edin a_foo.field, ancak bu, yapıya Foobir işaretçi olduğundan başarısız olur . Şunlara kesinlikle karşı tavsiye ederim typedef: C'deki ed işaretçiler önemlidir, yıldız işaretlerinizi gizlemeyin. Bırak parlasınlar.


8
Eminim asıl sorun budur. Yine de ara sıra beni ısırıyor, özellikle de birisi bir işaretçi türü yazmışsa.
John Bode

2
Bir dizi tahsis edilmemişse (malloc) ve erişilirse bu hatanın görüneceğini eklemeliyim.
en fazla

Bunun yayınlanmasından bu yana yaklaşık on yıl veya daha fazla zaman geçtiğini biliyorum, ancak bu son iki cümle bunu yeni favori yazım yaptı. "İşaretçiler önemlidir, yıldız işaretlerinizi gizlemeyin. Bırakın parlasınlar."
Aiden Blishen Cuneo

20

Bir yapının bir üyesine erişmeye çalışıyorsunuz, ancak bir yapı olmayan bir şeyde. Örneğin:


6

Aşağıdaki durumda da olabilir:

Örneğin. Bir yığının push fonksiyonunu ele alırsak:

Hata, push fonksiyonunda ve yorum satırında. İşaretçinin sparantez içine alınması gerekir. Doğru kod:


2
İşaretçi noktasını (dilde korkunç bir oyun yok) açık hale getirdiğiniz için teşekkür ederiz. Diğer cevaplar bundan bahsetti (örneğin, "işaretçilerinizin parlamasına izin verin"), ancak saat 2'de GDB ve Valgrind ile destansı bir savaşta mücadele ederken, benim gibi insanlar cevabınızın açıkça işaretçinin nasıl bir sorun olabileceğini ve bu sorunun nasıl düzeltilebileceğini gösterdiğini takdir ediyor. .
Max von Hippel

3

Muhtemelen bu hatanın kodda ortaya çıkabileceği tüm durumları ve aşağıdaki yorumları sıraladım. Daha fazla vakayla karşılaşırsanız lütfen ekleyin.

Temel fikirler doğrudur:

  • Kullanım .Yapı değişkeni ile . (Durum 2 ve 4)
  • Kullanım ->Yapıya işaretçi ile birlikte . (Durum 1 ve 3)
  • İmleci takip ederek yapı değişkenine veya yapı değişkenine işaretçiye ulaşırsanız, işaretçiyi köşeli ayraç içine sarın: (*ptr).ve (*ptr)->vs *ptr.ve*ptr-> (1. durum hariç tüm durumlar)
  • Aşağıdaki işaretçileri takip ederek ulaşıyorsanız, hangisi isteniyorsa yapıya veya yapıya doğru işaretçiye ulaştığınızdan emin olun. (Durum 5, özellikle 5.5)

1

Bu struct / union'ı tanımlayan bir başlık dosyası eklemeyi unuttuğunuz anlamına gelebilir. Örneğin:

foo.h dosyası:

main.c dosyası:


0

şu durumlarda da görünebilir:

onun yerine


Bu iki ifade arasında bir fark yok mu?
Nick Predey

1
@AlaaM. aylar sonra geriye dönüp baktığımda, noktalı virgülleri kaçırdım!
Nick Predey

0

Bunu üyelere erişmeye çalışırken gördüm.

Yapım şuydu:

Normalde yapı üyelerine şu şekilde erişiriz:

Ben zannettiğini TestVar bir işaretçi olarak ve bunu yaptı.

İşte o zaman bu hatayı gördüm.

bir yapı veya sendika olmayan bir şeyde 'a' üyesi için talep

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.