Duplicar posible:
What is the size of void?¿Por qué sizeof (void) == 1?
En §6.2.5.19, los profetas nos hizo saber que:
El tipo
void
comprende un conjunto vacío de valores
El n ¿por qué sizeof(void)
produce 1, cuando 0 parece ser suficiente?
Duplicar posible:
What is the size of void?¿Por qué sizeof (void) == 1?
En §6.2.5.19, los profetas nos hizo saber que:
El tipo
void
comprende un conjunto vacío de valores
El n ¿por qué sizeof(void)
produce 1, cuando 0 parece ser suficiente?
sizeof(void)
no se compilará en un compilador C.
ISO 9899: 2011 6.2.5/19
"El tipo nulo comprende un conjunto de valores vacío; es un tipo de objeto incompleto que no se puede completar."
ISO 9899: 2011 6.5.3.4/1
"El operador sizeof no será de aplicación a una expresión que tiene el tipo de función o un tipo incompleto"
Este es un texto normativo : sizeof (void) no es válido C.
... y aun así compila con gcc, ya que es una extensión de gcc. Consulte http : //gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith – Philip
Me pregunto cómo responde esto a la pregunta del OP ... – ThiefMaster
@Philip Sí, de hecho, pero lo hará no compilar en una implementación conforme de un compilador de C. – Lundin
Es una extensión gcc: http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith
En GNU C, las operaciones de suma y resta son compatibles con punteros a
void
y en punteros a funciones. Esto se realiza mediante el tratamiento del tamaño de unvoid
o de una función como 1.Una consecuencia de esto es que
sizeof
también está permitido envoid
y en los tipos de función, y devuelve 1.La opción
-Wpointer-arith
solicitudes una advertencia si se usan estas extensiones.
La razón por la void
necesita un tamaño para llevar a cabo este tipo de aritmética es que ptr - ptr2
en realidad no le da la diferencia numérica de las direcciones, pero el número de elementos de los dos punteros están separados - y el tamaño de un elemento apuntado por void *ptr
es sizeof(*ptr)
que es sizeof(void)
.
Si esta es una extensión, ¿por qué 'gcc -std = c99 -pedantic' da sizeof (void) == 1? -pedantic da una advertencia para usar sizeof en un tipo void, pero el código compila e imprime 1. – Lundin
@Lundin: porque usaste '-pedantic' y no' -pedantic-errors' – Christoph
@Christoph En mi opinión, debería ser suficiente para establecer el indicador -std = c99 y entonces ni siquiera debería permitir que el código se compile sin errores. – Lundin
Probablemente esté usando gcc, o algún otro compilador que hace esto como una extensión (en C, sizeof (void) no es válido).
gcc dice:
En GNU C, operaciones de suma y resta son compatibles con punteros para anular y sobre los punteros a funciones. Esto se hace tratando el tamaño de un vacío o de una función como 1.
Una consecuencia de esto es que sizeof también se permite en vacío y en tipos de función, y devuelve 1.
La opción -Winter-arith solicita una advertencia si estas extensiones son utilizadas.
... y no es válido debido a §6.5.3.4.1: "El operador sizeof no se aplicará a una expresión que tenga un tipo de función o un tipo incompleto , al nombre entre paréntesis de dicho tipo, oa un expresión que designa un miembro de campo de bits "y §6.2.5.19:" 'void' es un" tipo incompleto que no se puede completar. " – Philip
http://stackoverflow.com/questions/1666224/what-is-the-size-of-void –
Hay una diferencia entre esta pregunta y su duplicado anterior: esta es la respuesta aceptada contiene ac prueba temporal – Philip
http://meta.stackexchange.com/questions/32311/do-not-delete-duplicates – Flexo