2012-07-15 11 views

Respuesta

6

Fácil ejemplo: el tratamiento de la memoria como un array de unsigned char

void *memory = malloc(1000); //allocate a pool of memory 
uint8_t *ptr = memory+10; 
*ptr = 1 //set an integer value at byte 10 
uint8_t i = *ptr; //read an integer value from the 10th byte 

Puede utilizar números enteros también, pero entonces usted debe prestar atención acerca de la cantidad de bytes que está configurando a la vez.

+0

¿Es posible hacer esto lanzando el puntero de vacío en lugar de crear un puntero tipeado "intermedio"? – dtech

+0

por supuesto, utilizo una representación intermedia en aras de la claridad – ziu

3

Así, por "trabajo" Supongo que significa "¿cómo puedo eliminar la referencia/realizo la aritmética de punteros en un void*"? No puedes; tienes que lanzarlo, normalmente a char* si solo te preocupa leer fragmentos de memoria. Por supuesto, si ese es el caso, simplemente declarelo como char* para comenzar.

+0

Estoy interesado en leer/escribir cualquier tipo, no solo char. – dtech

+0

@ddriver: Eso no cambia nada. Tienes que lanzar el puntero. ¿Cómo esperaría una desreferencia y/o aritmética para actuar cuando el tipo es desconocido? No tiene sentido. Tendrá que pasar información adicional para saber cuál es el tipo subyacente. –

4

Las reglas son simples:

  • cada tipo de puntero (con excepción de los punteros de función) se puede lanzar desde y hacia void *, sin pérdida.
  • no puede realizar la aritmética del puntero en los punteros void *, y no puede desreferenciarlos
  • sizeof (char) es igual a 1, por definición; por lo que incrementar un puntero char significa "añadir 1" al valor del puntero "en bruto"

De esto se puede concluir que si desea realizar la aritmética de punteros "en bruto" que tiene que echar hacia y desde char *.

Cuestiones relacionadas