2011-02-09 21 views

cevap

7

bu reinterpret_cast<unsigned char*>(buf) çalışacaktır.


bu% 100 teknik yasal değildir nedeni bir nesne için bir işaretçi açıkça bir nesne için bir işaretçi dönüştürülebilir 7.

bölüm 5.2.10 expr.reinterpret.cast kurşun nedeniyle farklı tip. Orijinal tür, orijinal işaretçi değerini verir, böyle bir işaretçi dönüşümü sonucu belirtilmemiş.

Ki bu *reinterpret_cast<unsigned char*>(buf) = 'a' belirtilmemiş ama *reinterpret_cast<char*>(reinterpret_cast<unsigned char*>(buf)) = 'a' Tamam olduğu anlamına götürmek.

+0

Eğer standardı doğru olarak hatırlarsam, herhangi bir türdeki bir nesnenin belleğine erişmek için [[un] imzalı] char işaretçisini kullanmak yasal olduğunu belirten bir istisna vardır. Kodunuzun davranışını iyi tanımlanmış olduğunu düşünüyorum. – HolyBlackCat

+0

@HolyBlackCat Ben böyle bir ifadeyi hatırlamıyorum, bir referans sunabilirseniz, cevabı güncelleyeceğim. – Motti

+0

Şüphesiz, standart bir referans bulamıyorum. Fakat SO üzerinde bazı iddialar buldum: char * 'için katı takma kuralının bir istisnası var (bu, herhangi bir türdeki bir nesnenin belleğine erişmek için [[un] imzalı işaretçiyi kullanmanın yasal olduğu anlamına gelir) "). Bkz: http://stackoverflow.com/a/99010/2752075 'Takma ad <...> için char * kullanabilirsiniz. Kurallar char * için bir istisna sağlar (imzalı char ve imzasız char dahil). Her zaman diğer türlerin taklit edildiği varsayılır. Ancak bu başka bir şekilde işe yaramaz: yapınızın takma adının C++ 'da – HolyBlackCat

4

Sadece dökün?

unsigned char *conbuf = (unsigned char *)buf; 
+4

numaralı arabelleği taklit ettiği varsayımı yoktur, "Sadece yayınla" her zaman bir yasal uyarıya ihtiyaç duyar :) – tenfour

+0

Heh-heh! Yasal Uyarı: Bu cevap, soruda gösterdiğiniz metin için iyidir. İmzalı 8 bit sayı dizilerinde denemeyin. – Dave

İlgili konular