2012-06-10 11 views
12

Me di cuenta de que cuando se compiló con GCC 4.6 sizeof(Foo) es 0 y sizeof(Bar) es 1. Por alguna razón, agregué una matriz vacía en una estructura vacía con tamaño 0. Pensé que los tamaños de ambas estructuras deben ser iguales . ¿Que esta pasando aqui?Tamaño cero struct

struct Foo 
{ 
    char x[]; 
}; 

struct Bar {}; 
+1

Es extraño, 'sizeof' nunca puede ser _0 _... –

+0

@ K-ballo: para arreglos flexibles como' char x [] 'sizeof es 0. – Tudor

+0

@Tudor: matrices flexibles, ¿eso es una extensión del compilador? –

Respuesta

16

Ni struct declaración está permitido por la norma C. 6.7.2.1 (8) en n1570:

If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined.

y el párrafo 18 en la misma sección:

As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. In most situations, the flexible array member is ignored. In particular, the size of the structure is as if the flexible array member were omitted except that it may have more trailing padding than the omission would imply.

(énfasis mío)

miembros de la matriz flexibles no están permitidos en C++, por lo que la el código tampoco es válido C++.

Como no es un código válido, los valores informados por sizeof para estos no tienen sentido.

1

El operador sizeof nunca produce 0, incluso para una clase vacía.

como se puede ver here on msdn

, además, el MSDN está diciendo:

El operador sizeof no se puede utilizar con los siguientes operandos:

  • funciones. (Sin embargo, sizeof se puede aplicar a punteros a funciones).
  • Campos de bits.
  • Clases no definidas.
  • El tipo vacío.
  • Arrays asignados dinámicamente.
  • Arrays externos.
  • Tipos incompletos.
  • Nombres entre paréntesis de tipos incompletos.
1

C y C++ no permiten objetos de tamaño cero.

gcc los admite como extensión. Si compila con las opciones adecuadas, como

gcc -std=c99 -pedantic -Wall -Wextra 

gcc por lo menos le advertirá sobre ellas; g ++ tiene opciones similares.