2011-02-09 15 views

risposta

7

Anche se non può essere legale tecnicamente al 100% questo funzionerà reinterpret_cast<unsigned char*>(buf).


Il motivo non è al 100% tecnicamente legale è dovuto alla sezione 5.2.10 expr.reinterpret.cast proiettile 7.

Un puntatore a un oggetto può essere esplicitamente convertito in un puntatore a un oggetto di un diverso tipo. il tipo originale restituisce il valore del puntatore originale, il risultato di tale conversione del puntatore non è specificato.

che mi porto nel senso che non è specificato, ma *reinterpret_cast<unsigned char*>(buf) = 'a'*reinterpret_cast<char*>(reinterpret_cast<unsigned char*>(buf)) = 'a' è OK.

+0

Se ricordo correttamente lo standard, c'è un'eccezione che dice che è legale usare il puntatore a [[un] signed] char per accedere alla memoria di un oggetto di qualsiasi tipo. Penso che il comportamento del tuo codice sia ben definito. – HolyBlackCat

+0

@HolyBlackCat Non ricordo nessuna di queste parole, se potessi fornire un riferimento aggiornerò la risposta. – Motti

+0

Non riesco a trovare un riferimento standard. Ma ho trovato alcune affermazioni sul modo che ci sia un'eccezione alla regola rigorosa aliasing per 'char *' (il che significa che "è legale usare puntatore a [[un] firmato] char di accedere alla memoria di un oggetto di qualsiasi tipo "). Vedi questo: http://stackoverflow.com/a/99010/2752075 'Puoi usare char * per l'aliasing <...>. Le regole consentono un'eccezione per char * (incluso char firmato e unsigned char). Si presume sempre che char * alias altri tipi. Tuttavia, questo non funzionerà nell'altro senso: non ci sono supposizioni che la tua strucse alias un buffer di caratteri. – HolyBlackCat

4

Basta lanciarla?

+4

in C++, "Just cast it" ha sempre bisogno di una dichiarazione di non responsabilità :) – tenfour

+0

Heh-heh! Disclaimer: questa risposta va bene per il testo che mostri nella domanda. Non provarlo su matrici di numeri a 8 bit con segno. – Dave