2012-04-14 17 views
6

Ho il seguente codice;Conversione non valida da 'void *' a 'char unsigned *'

void* buffer = operator new(100); 
unsigned char* etherhead = buffer; 

Ho riscontrato il seguente errore per quella riga durante il tentativo di compilazione;

error: invalid conversion from ‘void*’ to ‘unsigned char*’ 

Perché ricevo questo errore, ho pensato che un vuoto era "tipo-less" in modo che possa puntare a qualche cosa, o qualsiasi cosa può puntare ad esso?

risposta

9

È necessario eseguire il cast come non è possibile convertire un vuoto * in qualcosa senza prima averlo lanciato.

Si avrebbe bisogno di fare

unsigned char* etherhead = (unsigned char*)buffer; 

(anche se si potrebbe utilizzare un static_cast anche)

Per saperne di più su puntatori void, un'occhiata a 6.13 — Void pointers.

0
void *pt; 

pt=(void*)&i; 
pt=(void*)&dbl; 

Ecco come lo farei.

+0

Oh :(Ho pensato che potevi, anche se potessi allocare X byte in memoria per un uso successivo, perché un 10 byte char o 10 byte int sono entrambi 10 byte lunghi, irrilevanti dei valori dei 10 byte assegnati. – jwbensley

+0

C'è un motivo valido per il riutilizzo della memoria? In caso contrario, non farlo, rende il programma inutilmente complesso. – Philipp

4

È possibile convertire qualsiasi puntatore in un void *, ma non è possibile convertire void * in nessun altro senza cast. Potrebbe aiutare a immaginare che "void" sia la classe base di TUTTO, e "int" e "char" e quali non siano tutte sottoclassi di "void".

1

C++ è progettato per essere più sicuro di tipo di C. Se questo è il codice C, può essere OK, ma dipende anche da quale compilatore si sta utilizzando in questo momento.

Inoltre, tecnicamente, "Esterno '' int *" C e "int *" sono diversi tipi ... (come compilatore Solaris sarà scegliere questo fuori)

vorrei suggerire di utilizzare C++ stile gettato al posto di Cast. Ci sono più descrizioni qui:

Regular cast vs. static_cast vs. dynamic_cast.

5

Un void* potrebbe puntare a qualche cosa e si può convertire un puntatore a qualsiasi altra cosa ad un void*, senza un cast, ma è necessario utilizzare un static_cast di fare il contrario.

unsigned char* etherhead = static_cast<unsigned char*>(buffer); 

Se si desidera un buffer allocato dinamicamente di 100 unsigned char si sta meglio fare questo ed evitando il cast.

unsigned char* p = new unsigned char[100]; 
3

Ecco un po 'di pensiero laterale: ogni volta che pensi di aver bisogno di calchi o puntatori, ripensaci. Se tutto ciò che serve è 100 byte senza segno di memoria, utilizzare

std::array<unsigned char, 100> data; 

o

unsigned char data[100]; 

Se la dimensione non è costante, utilizzare un vettore:

std::vector<unsigned char> data(size); 

puntatori prime, il new l'operatore e i cast sono insicuri, difficili da ottenere e rendono più difficile capire il programma. Evitali se possibile.