2011-02-09 17 views

Odpowiedz

7

Chociaż nie może być technicznie 100% legalne to będzie działać reinterpret_cast<unsigned char*>(buf).


Powód tego nie jest w 100% technicznie prawne względu rozdział 5.2.10 expr.reinterpret.cast pocisku 7.

wskaźnik do obiektu może być bezpośrednio przekształcony w wskaźnikiem do przedmiotem inny rodzaj. oryginalny typ daje pierwotną wartość wskaźnika, wynik takiej konwersji wskaźnika jest nieokreślony.

Co mam na myśli, że *reinterpret_cast<unsigned char*>(buf) = 'a' jest nieokreślony, ale *reinterpret_cast<char*>(reinterpret_cast<unsigned char*>(buf)) = 'a' jest OK.

+0

Jeśli dobrze pamiętam standard poprawnie, istnieje wyjątek, który mówi, że jest to legalne użycie wskaźnika do [[un] podpisał] char aby uzyskać dostęp do pamięci obiektu dowolnego typu. Myślę, że to sprawia, że ​​zachowanie twojego kodu jest dobrze zdefiniowane. – HolyBlackCat

+0

@HolyBlackCat Nie pamiętam żadnego takiego sformułowania, jeśli mógłbyś podać referencję, zaktualizuję odpowiedź. – Motti

+0

Niestety nie mogę znaleźć standardowego odnośnika. Ale znalazłem kilka twierdzeń na SO, że istnieje wyjątek od zasady ścisłego aliasingu dla 'char *' (co oznacza, że ​​"legalne jest używanie wskaźnika do [[un] signed] char, aby uzyskać dostęp do pamięci dowolnego obiektu "). Zobacz: http://stackoverflow.com/a/99010/2752075 'Możesz użyć char * do aliasingu <...>. Reguły zezwalają na wyjątek dla char * (łącznie ze znakiem char i unsigned char). Zawsze zakłada się, że char * aliasy innych typów. Nie zadziała to jednak w inny sposób: nie ma założenia, że ​​struktura tworzy aliasy bufora znaków. " – HolyBlackCat

4

Wystarczy rzucić go?

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

w C++," Po prostu rzuć to "zawsze wymaga zastrzeżenia: – tenfour

+0

Heh-heh! Zastrzeżenie: ta odpowiedź jest odpowiednia dla tekstu, który wyświetlasz w pytaniu. Nie próbuj tego na tablicach z 8-bitowymi liczbami. – Dave

Powiązane problemy