2012-04-14 34 views
6

Tengo el siguiente código;Conversión inválida de 'void *' a 'unsigned char *'

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

Recibo el siguiente error al intentar compilar;

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

¿Por qué aparece ese error, pensé que era un vacío "tipo-menos" por lo que puede apuntar a cualquier cosa, o nada puede apuntar a ella?

Respuesta

9

Debe convertir como no puede convertir un vacío * a algo sin convertirlo primero.

Usted tendría que hacer

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

(aunque se podría utilizar un static_cast también)

Para obtener más información sobre punteros void, echar un vistazo a 6.13 — Void pointers.

0
void *pt; 

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

Así es como yo lo haría.

+0

Oh :(Pensé que podría, aunque podría asignar X bytes en la memoria para su uso posterior, porque un byte de 10 bytes o un int de 10 bytes son ambos de 10 bytes de largo, irrelevante de los valores de los 10 bytes asignados. ¿Esto es incorrecto? – jwbensley

+0

¿Hay alguna razón convincente por la que desee volver a utilizar la memoria? De lo contrario, no lo haga, hace que el programa sea innecesariamente complejo. – Philipp

4

Puede convertir cualquier puntero a un vacío *, pero no puede convertir el vacío * a cualquier otra cosa sin un molde. Podría ayudar a imaginar que "vacío" es la clase base para TODO, e "int" y "char" y todo lo demás son subclases de "vacío".

1

C++ está diseñado para ser más seguro que C. Si se trata de código C, puede estar bien, pero también depende del compilador que esté utilizando en este momento.

Además, técnicamente, "externo '' int *" C y "int *" son diferentes tipos ... (como compilador de Solaris recogerá esto)

yo sugeriría que usando C++ estilo fundido en lugar de C emitido. Hay más descripciones aquí:

Regular cast vs. static_cast vs. dynamic_cast.

5

Un void* podría apunte a nada y se puede convertir un puntero a cualquier otra cosa a un void* sin una conversión pero usted tiene que utilizar un static_cast a hacer a la inversa.

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

Si quieres un búfer asignado dinámicamente de 100 unsigned char usted es mejor hacer esto y evitar el reparto.

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

Aquí hay un poco de pensamiento lateral: cuando creas que necesitas moldes o punteros, piénsalo de nuevo. Si todo lo que necesita es 100 bytes sin signo de la memoria, utilice

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

o

unsigned char data[100]; 

Si el tamaño no es constante, utilizar un vector:

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

punteros primas, la new operador, y los moldes son inseguros, difíciles de hacer bien y hacen que su programa sea más difícil de entender. Evítalos si es posible.

Cuestiones relacionadas