2012-04-07 17 views
7

Estoy mirando mi libro de texto y estoy un poco confundido acerca del código que está allí. En una parte, se está realizando la aritmética de punteros de la siguiente manera:void * vs. char * aritmética del puntero

void* bp; 
... 
bp = (void*)((char*)(bp)+16); 
... 

pero más adelante, que hacen lo siguiente:

void* bp; 
... 
bp = bp+16; 
... 

Siento que deben ser dos cosas diferentes pero que están tratando es como lo mismo. me siento así porque, por ejemplo, si tuviera que hacer un acceso a matriz (para una matriz de enteros, por ejemplo), que haría la siguiente

int* a = malloc(n*sizeof(int)); 
... 
q = *(a+1); 
... 

en este caso, ¿no es así con el acceso a la próxima 4 bytes en la matriz de enteros y no el siguiente byte? Del mismo modo, creo que si tengo void * a, entonces * (a + 1) deberían ser los siguientes 4 bytes ... ¿O no es así? Gracias.

+0

Ese segundo ejemplo no debe compilarse. –

+1

@OliCharlesworth: No compilará (o al menos activará una advertencia) si compila en modo conforme. gcc no se está ajustando por defecto e implementa la aritmética 'void *' como una extensión. –

Respuesta

11

Es un desliz. La aritmética en void * no está definida por el estándar, pero algunos compiladores la ofrecen como una extensión, comportándose igual que char * para la aritmética. El segundo formalmente no es válido C, pero se deslizó a través de hábito (malo) presumiblemente.

+0

Entonces, ¿la forma correcta de acceder a los siguientes 16 bytes sería lanzar primero a char * y luego agregar 16? Lol, tengo que cambiar una buena cantidad de código ahora. Ah, y copié el primero un poco mal, hice un pequeño cambio, pero no creo que vaya a hacer una diferencia en mi pregunta. – de1337ed

+0

O puede lanzar a 'uint64_t *' y agregar 2;) Sí, la forma portátil es convertir a un puntero a un tipo de tamaño conocido y hacer aritmética sobre eso. Si no necesita la portabilidad y los documentos del compilador de que 'void *' arithmetic funciona de una manera específica, puede usar eso. Pero, por supuesto, en algún momento tendrá que realizar un puerto a un compilador diferente ... –