Aritmética de punteros cuando el vacío tiene un tamaño desconocido [cerrado]
En Visual Studio C ++ versión 9 (y probablemente otras versiones también), el siguiente código:
int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;
error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size
Este código funciona bajo GCC, que tratasizeof(void)
como1
.
¿Hay alguna forma de evitar esta limitación, como el lanzamiento explícito achar *
a los efectos de la aritmética de punteros se suma a la confusión (void *
es bien reconocido y se utiliza como un puntero sin tipo a la memoria en bruto).
sizeof(void)
para demostrar que soy muy consciente del hecho de que no es1
es la causa del problemaEl ejemplo del código es simplemente demostrar lo que se requiere para generar los errores.Sé que esta no es una forma "normal" de usarvoid
, pero esto es C, y estas cosas pasan.Sí, la gente necesita hacer esto a bajo nivel. No estoy detrás de por qué, estoy detrás de cómo. Si desea saber por qué, eche un vistazo a alguna fuente del kernel o a su amigable glibc.Update1Parece que esta pregunta ha generado una gran confusión. La pregunta no es sobrepor qué teniendosizeof(void) == 1
No es estándar, pero qué hacer cuando no lo es.
En el caso de que se haga aritmética de punteros de un solo byte, resulta que la conversión achar *
es la respuesta correcta, no porque*(void *)
no tiene tamaño, sino porque la norma realmente garantiza que*(char *)
es siempre1
. Por lo tanto el uso dechar *
Siempre es correcto, y congruente convoid *
con la extensión GCC para los fines de la aritmética de punteros en bruto.
Para reforzar aún más el punto,void *
es la opción correcta para los punteros a la memoria sin tipo, ychar *
es el tipo correcto para lanzarpara aritmética de puntero en bruto.