una tipos tamaño sirve sintaxis saber que punteros para listas estructuras estructura ejemplos como c compiler-construction

tipos - sizeof en c sintaxis



¿Cuál es el tamaño de una estructura vacía en C? (4)

En C99: "Si la lista de declaración de estructura no contiene miembros con nombre, el comportamiento es indefinido".

La sintaxis realmente no lo permite de todas formas, aunque no veo nada que diga que se requiere un diagnóstico, lo que lo coloca de nuevo en el campo del "comportamiento indefinido".

Según mi opinión, es cero, pero parece haber una pequeña confusión here

Lo he probado con el compilador gcc y me da cero como salida. Sé que en C ++, el tamaño de una clase vacía es 1. Avísame si me falta algo aquí.


La gramática C no permite que el contenido de una struct esté vacío; debe haber al menos un campo de bits sin nombre o un miembro con nombre (en lo que respecta a la gramática), no estoy seguro de que una estructura que contiene solo una campo de bits sin nombre es válido de otro modo).

El soporte para estructuras vacías en C es una extensión en GCC .

En C ++ y la especificación de miembro de estructura / clase vacía se permite explícitamente, pero el tamaño se define como 1, a menos que, como parte de la optimización de la base vacía, el compilador pueda hacer que una clase base vacía no ocupe espacio en la clase derivada.


Una estructura no puede estar vacía en C porque la sintaxis lo prohíbe. Además, hay una restricción semántica que hace que el comportamiento sea indefinido si una estructura no tiene un miembro con nombre:

struct-or-union-specifier: struct-or-union identifieropt { struct-declaration-list } struct-or-union identifier struct-or-union: struct union struct-declaration-list: struct-declaration struct-declaration-list struct-declaration struct-declaration: specifier-qualifier-list struct-declarator-list ; /* type-specifier or qualifier required here! */ specifier-qualifier-list: type-specifier specifier-qualifier-listopt type-qualifier specifier-qualifier-listopt struct-declarator-list: struct-declarator struct-declarator-list , struct-declarator struct-declarator: declarator declaratoropt : constant-expression

Si tú escribes

struct identifier { };

Le dará un mensaje de diagnóstico, ya que viola las reglas sintácticas. Si tú escribes

struct identifier { int : 0; };

Entonces tiene una estructura no vacía sin miembros nombrados, lo que hace que el comportamiento sea indefinido y que no requiera un diagnóstico:

Si la lista-declaración-estructura no contiene miembros nombrados, el comportamiento no está definido.

Tenga en cuenta que lo siguiente no está permitido porque un miembro de matriz flexible no puede ser el primer miembro:

struct identifier { type ident[]; };


en VC 8 Da error si intentamos obtener el tamaño de la estructura vacía, al contrario, en linux con gcc da el tamaño 1 porque usa la extensión gcc en lugar de la especificación del lenguaje c que dice que este es un comportamiento indefinido.

struct node { // empty struct. }; int main() { printf("%d", sizeof(struct node)); return 0; }

en windows vc 2005 Da error de compilación en linux con gcc da tamaño 1 porque la extensión gcc http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Empty-Structures.html#Empty-Structures (As Señalado por Michael Burr)