Czy istnieje sposób przekonwertowania char[]
na unsigned char*
?Konwertuj tablicę znaków na niepodpisany znak *
char buf[50] = "this is a test";
unsigned char* conbuf = // what should I add here
Czy istnieje sposób przekonwertowania char[]
na unsigned char*
?Konwertuj tablicę znaków na niepodpisany znak *
char buf[50] = "this is a test";
unsigned char* conbuf = // what should I add here
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.
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
@HolyBlackCat Nie pamiętam żadnego takiego sformułowania, jeśli mógłbyś podać referencję, zaktualizuję odpowiedź. – Motti
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