2011-06-23 26 views
24

Tengo un puntero de vacío llamado ptr. Quiero incrementar este valor por una cantidad de bytes. ¿Hay alguna forma de hacer esto?¿Aumentar el puntero del vacío en un byte? ¿por dos?

Tenga en cuenta que quiero hacer esto en el lugar sin crear más variables.

¿Podría hacer algo como ptr = (void *)(++((char *) ptr));?

Respuesta

48

No se puede realizar la aritmética en un puntero void porque la aritmética del puntero se define en términos del tamaño del objeto apuntado.

Puede, sin embargo, del puntero a un char*, hacer aritmética sobre ese puntero, y luego convertir de nuevo a un void*:

void* p = /* get a pointer somehow */; 

// In C++: 
p = static_cast<char*>(p) + 1; 

// In C: 
p = (char*)p + 1; 
+1

¿No debería ser reinterpret_cast? – Balk

+4

@Balk: 'static_cast' es suficiente. –

15

No se pueden realizar operaciones aritméticas en void puntero.

El compilador no conoce el tamaño del elemento (s) al que apunta el puntero void. Puede convertir el puntero a (char *) para hacerlo.

En gcc hay una extensión que trata el tamaño de void como 1. entonces uno puede usar arithematic en un void* para agregar un desplazamiento en bytes, pero usarlo produciría un código no portátil.

+0

En GCC es posible porque 'sizeof (void)' '1' rendimientos. –

+0

@Blagovest Buyukliev: Es una extensión en GCC que trata el tamaño de un vacío como 1, usarlo produciría código no portátil. –

+1

@Blag: como siempre, compile con '-pedantic'. :) – Xeo

4

Simplemente incrementando el void* le sucede a trabajar en gcc:

#include <stdlib.h> 
#include <stdio.h> 

int main() { 
    int i[] = { 23, 42 }; 
    void* a = &i; 
    void* b = a + 4; 
    printf("%i\n", *((int*)b)); 
    return 0; 
} 

es conceptualmente (y oficialmente) malinterpreten, sin embargo, por lo que desea hacer explícito: echarlo a char* y luego de vuelta.

void* a = get_me_a_pointer(); 
void* b = (void*)((char*)a + some_number); 

Esto hace obvio que está aumentando en una cantidad de bytes.

+1

Como siempre, compile con '-pedantic'. :) Es una extensión no conforme por GCC. – Xeo

+0

Supongo que estoy echado a perder :) - edité la respuesta para la corrección – tdammers

-1

que puede hacer:

++(*((char **)(&ptr))); 
+4

Sí, pero ¿por qué _sí? Es un código oscuro y horrible que hace innecesariamente difícil analizar lo que está haciendo, sin una buena razón. Además, los moldes de estilo C se deben desalentar en C++, pero ese es el menor de los problemas aquí. –

+2

También puede meter un palo de fuego en su ojo. Probablemente duela menos que mirar '++ (* ((char **) (& ptr)));'. –

Cuestiones relacionadas