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.