2012-05-11 19 views
10

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?

+0

http://stackoverflow.com/questions/1666224/what-is-the-size-of-void –

+0

Hay una diferencia entre esta pregunta y su duplicado anterior: esta es la respuesta aceptada contiene ac prueba temporal – Philip

+0

http://meta.stackexchange.com/questions/32311/do-not-delete-duplicates – Flexo

Respuesta

10

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.

+0

... 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

+4

Me pregunto cómo responde esto a la pregunta del OP ... – ThiefMaster

+0

@Philip Sí, de hecho, pero lo hará no compilar en una implementación conforme de un compilador de C. – Lundin

19

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 un void o de una función como 1.

Una consecuencia de esto es que sizeof también está permitido en void 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).

+0

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

+3

@Lundin: porque usaste '-pedantic' y no' -pedantic-errors' – Christoph

+1

@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

7

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.

+1

... 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

Cuestiones relacionadas