Void * a = & a nasıl yasaldır?


88

Aşağıdaki C ++ kodunu göz önünde bulundurun:

void* a = &a;

Derleyici neden bildirilmemiş bir tanımlayıcı kullanmaktan şikayet etmez?

Ayrıca, derleyici değişkenin ne aolduğunu düşünüyor? Boş bir nesneye void*işaretçi mi yoksa bir işaretçiye işaretçi mi?




15
Bunu neden yapmak istediğinizi belirtmelisiniz - yığının tepesine bir işaretçi getirmek için (buradan her türlü şeyle oynayabilirsiniz).
OrangeDog

Yanıtlar:


95

C ++ 'da değişkenlerin bildiriminin kapsamı oldukça şaşırtıcı olabilir:

void* a =               &a;
         ^~~~~~~~~~~~~~~~~
          a declared as `void*` from here on

Bu nedenle, &abir void**ancak herhangi işaretçi türü beri örtük olarak dönüştürülebilir olduğunu void*...


Buna yararlı bir nesneyi nasıl atarım?
user2681063

22
@ user2681063 a = &userfulObject?
Nikos C.

4
@MarkGarcia: void *a = a;Yerel olarak bildirildiğinde UB olacağını unutmayın , aksi takdirde ad alanı kapsamında sorun yoktur.
Nawaz

1
@TheodorosChatzigiannakis: Öyle olduğuna inanırım, evet.
Matthieu M.

1
Burada özel bir alıntı gerçekten hoş olurdu.
Benjamin Gruenbaum

30

Eşdeğerdir

void* a;
a = &a;

Bu nedenle ailan edilmiştir. Yani yazılı aadresini alır . Yani bir boşluk göstericisinin göstericisidir. (Henüz herhangi bir nesne tanımlamadınız.)aa


9
Teknik olarak, bir nesne tanımladınız. akendisi bir nesnedir. (C ++ 'da tüm nesnelerin kullanıcı tanımlı türleri yoktur)
MSalters

1
@MSalters Bu bahsettiğiniz 'nesne' nedir? : D
Gusdor

3
@Gusdor Olay ufkunun boşluğunun ötesinde ne olduğunu ancak varsayabiliriz.
Cole Johnson

Farklı şekilde adlandırılırlar, ancak bu durumda "etki" aynıdır
Stasik

Genel olarak eşdeğer değillerdir, ancak bu senaryoda öyleler.
Yörüngede Hafiflik Yarışları

7

İçinde void* a, abir voidtüre değil, "herhangi bir" türe (özel durum) bir gösterici olarak bildirilir . aElbette, beyan edilen diğer herhangi bir değişkene olduğu gibi, bir adres (bellekteki konum) atanır .

Bundan sonra ifade &a, aaz önce bildirilen değişkeni başlatmak için değerlendirilir (aynı zamanda , ancak bu ilgili değildir). Tip &atürüne ile tam uyumlu "herhangi bir tür için işaretçi", özel bir durum, "herhangi bir tür işaretçisine" dir a. Ergo, derleyici mesajı yok.

Sonuç: void*Güçlü tip denetimi istiyorsanız kullanmayın . Her şey ona dönüştürülebilir. Ters yönde tam tersi, void*kendisi hariç (bir türün kendisiyle uyumsuz olması gereksiz bir istisna olur).

Ayrıca, AFAIR bu gerçekten C'den geliyor.

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.