C'è un modo per convertire char[]
in unsigned char*
?Converti array di caratteri in char unsigned *
char buf[50] = "this is a test";
unsigned char* conbuf = // what should I add here
C'è un modo per convertire char[]
in unsigned char*
?Converti array di caratteri in char unsigned *
char buf[50] = "this is a test";
unsigned char* conbuf = // what should I add here
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.
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
@HolyBlackCat Non ricordo nessuna di queste parole, se potessi fornire un riferimento aggiornerò la risposta. – Motti
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