c
  • pointers
  • void
  • 2016-03-22 19 views -3 likes 
    -3

    Duruminfact zaten

    iki a içeren yazdırmak amaçlamaktadır aşağıdaki kaynak kodunu düşünün dökme geçersiz işaretçi hatası De-referans almak, yani çıkış "aa" olmalıdır:

    #include <stdio.h> 
    
    int main() 
    { 
    char a = 'a'; 
    void* a_pnt = &a; 
    void* b_pnt = (char*)a_pnt; 
    
    printf("%c", *(char*)a_pnt); 
    printf("%c", *b_pnt);// why is the compiler saying I am dereferencing a void pointer? It was already cast 
    return 0; 
    } 
    

    komplikasyon

    İlk "a" çalışmasının yazdırılması ancak derleyici, satır 10'da ("a" nın ikinci baskısı) derleme zamanı hatası veriyor:

    geçersiz ifade

    ve aynı satırda bir uyarı söyleyerek

    kullanımı geçersiz:

    dereferencing 'hükümsüz *' işaretçi

    b_pnt gerçekten ilan edilmesine rağmen bir void işaretçi, 7 satırındaki tanımında bir karakter işaretçisine verildi. Benim tek şikayetimi neden sadece bir c aynı zamanda referans yaparken ast. Benim önsezim, ilk değişkenin iyi çalıştığı gerçeğine dayanır.

    Çözüm

    çözüm yazdırmadan önce karakter işaretçi ayarlıyoruz için 'b' ve döküm adında bir karakter değişkeni bildirmek ve tanımlamaktır:

    #include <stdio.h> 
    
    int main() 
    { 
    char a = 'a'; 
    void* a_pnt = &a; 
    void* b_pnt = a_pnt; 
    char b = *((char*)b_pnt); 
    
    printf("%c", *(char*)a_pnt); 
    printf("%c", b);// why is the compiler saying I am dereferencing a pointer? 
    return 0; 
    } 
    

    soru hâlâ kalır: İlk yaptığımız Neden girişimi başarısız mı?

    Sorunu açıklamak için bilerek boş gösterici ile başlıyorum. Tamamen doğru işaretçi tipi ile tamamen önlenmiş olabilir.

    +0

    neden 'void *' değil, char * b_pnt = a_pnt' değil? – ensc

    +1

    (cast) expr '' expr' türünü etkilemez. Bu sadece (cast) expr türünü etkiler. – EOF

    +0

    @ensc Kasten konuyu göstermek için boşluk işaretçisiyle başlıyorum. Gerçekten de tamamen reddedilmiş olabilirdi –

    cevap

    1

    b_pnt'a atanırken bir döküm gerçekleştirdiğinizden, bu türün değiştiği anlamına gelmez. Bu tür hala void * ve bunun bir hata olduğunu ortadan kaldırmak.

    Hiçbir işlevsiz işaretçi türünü bir uyarı olmadan void *'a serbestçe atayabilirsiniz. Ancak derleyici orada ne tür bir işaretçinin saklandığını takip etmiyor, bu yüzden hala yayınlanmadan önce döküm edilmesi gereken bir void *.

    +0

    Aynı ifadede olmasa bile, dereferans öncesi cast atıldı. –

    +0

    @DeanP Herhangi bir noktada yayınlanmadı. "B_ptr" için bir döküm değeri atadınız, ancak bu türünü değiştirmiyor. Ayrıca ilgisiz bir ifadeyle onu dökmez. Bir değişkenin türünü değiştirmek, değişkenin kendisinin değil, bu bağlamdaki değişkenin * tipini * değiştirir. – dbush

     İlgili konular

    • İlgili sorun yok^_^