2011-12-24 10 views

Respuesta

9

Ni C ni C++ permiten matrices de longitud cero, por lo que su programa está mal formado.

(por ejemplo, C++ 11, 8.3.4/1: "[el tamaño de la matriz] deberá ser mayor que cero".)

(Como un punto de razón de ser: Una matriz de longitud cero sería complicado y confuso para conciliar con el requisito de que cada objeto tenga una dirección única).

Como señala @sidyll, las matrices de longitud cero están disponibles como extension en GCC.

+0

no está dando error en el compilador de gcc ubuntu 10.04 –

+4

@ user1044137: Hay muchas, muchas, muchas maneras de escribir tanto en C como en C++ programas que están mal formados y para los que no recibe ningún diagnóstico. Para el caso, mi GCC dice 'advertencia: ISO C++ prohíbe la matriz de tamaño cero'. Siempre debes habilitar todas las advertencias. –

+1

¿Por qué está compilando un programa ** C ** de una pregunta ** C ** con un compilador ** C++ ** y publicando un extracto estándar ** C++ **? – sidyll

3

Usted encontrará su respuesta en The GCC manual

Si está utilizando C99

  • miembros de la matriz flexibles se escriben como contenidos [] sin las 0.
  • miembros de la matriz flexibles tienen incompleta tipo, por lo que el operador sizeof puede no ser aplicado. Como una peculiaridad de la implementación original de las matrices de longitud cero, sizeof se evalúa como cero.
  • Los miembros de la matriz flexible solo pueden aparecer como el último miembro de una estructura que de lo contrario no está vacío.
  • Una estructura que contiene un miembro de matriz flexible, o una unión que contiene dicha estructura (posiblemente recursivamente), puede no ser un miembro de una estructura o un elemento de una matriz. (Sin embargo, estos usos están permitidos por GCC como extensiones

Y, por supuesto, la forma en que pueden ser útiles:.

matrices de longitud cero se permite la entrada de GNU C. Son muy útiles como el último elemento de una estructura que es realmente una cabecera para un objeto de longitud variable:

struct line { 
    int length; 
    char contents[0]; 
}; 

struct line *thisline = (struct line *) 
    malloc (sizeof (struct line) + this_length); 
thisline->length = this_length; 
+1

En C11 y en C99, 'sizeof' no siempre es un operador en tiempo de compilación (que estaba solo en C89). –

1

no hay mucho uso como se da en el ejemplo, pero matriz de tamaño cero s se utilizan con frecuencia en estructuras en las que el último elemento se dinámicamente dimensionado:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [0]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long * s.n_variable_elements; 

El uso de una matriz de longitud cero es:

1) variable_elements tiene una dirección (a pesar de la respuesta de alguien)
2) también tiene la semántica de matriz
3) calcular el tamaño dinámico de la matriz se simplifica

Desafortunadamente, algunos compiladores (MSC) habría lanzar un ajuste hissy más de una construcción tal y forzar una menor medida, apaciguar, técnicamente incorrecto reformulación:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [1]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long + (s.n_variable_elements - 1); 

Think de una matriz de tamaño cero como un marcador de posición. Ya no hay necesidad de hacer eso, a menos que esté obligado a usar C, que es el caso en muchos entornos integrados.

Cuestiones relacionadas