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.
neden 'void *' değil, char * b_pnt = a_pnt' değil? – ensc
(cast) expr '' expr' türünü etkilemez. Bu sadece (cast) expr türünü etkiler. – EOF
@ensc Kasten konuyu göstermek için boşluk işaretçisiyle başlıyorum. Gerçekten de tamamen reddedilmiş olabilirdi –