2012-07-31 9 views
38

cuando estoy buscando el código del núcleo de Linux, conocer el código de abajo:¿Cuál es el propósito de una matriz de longitud cero en una estructura?

struct thread_info { 
    struct task_struct *task; 
    struct exec_domain *exec_domain; 
    unsigned long  flags; 
    __u32   status; 
    __u32   cpu; 
    int   preempt_count; 
    mm_segment_t  addr_limit; 
    struct restart_block restart_block; 
    void __user  *sysenter_return; 
    unsigned long   previous_esp; 
    __u8   supervisor_stack[0]; 
}; 

en cuenta que la última variable "supervisor_stack", que es una matriz de longitud cero, lo que es el uso de la misma? ¡Gracias por adelantado!

+0

Creo que eso significa una matriz de longitud cero, creo que significa que está obteniendo o recuperando el primer valor de la matriz. –

Respuesta

32

Es la versión pre-C99 de un miembro de matriz flexible ofrecido por GCC como una extensión.

La manera C99 es definir el miembro de matriz flexible, con corchetes vacíos,

__u8 supervisor_stack[]; 

Se usa para almacenar datos de cuya cantidad no es constante contigua a la estructura. La memoria se asigna en forma

struct foo *ptr = malloc(sizeof *ptr + whatever_is_needed); 

En el párrafo 18 de 6.7.2.1, el estándar (proyecto N1570) los describe:

Como caso especial, el último elemento de una estructura con más de un miembro nombrado puede tener un tipo de matriz incompleta; esto se llama un miembro de matriz flexible. En la mayoría de las situaciones, se ignora el miembro de matriz flexible. En particular, el tamaño de la estructura es como si se hubiera omitido el miembro de matriz flexible , excepto que puede tener más relleno posterior que que implicaría la omisión. Sin embargo, cuando un operador . (o ->) tiene un operando izquierdo que es (un puntero a) una estructura con un miembro de matriz flexible y el operando derecho que se llama , se comporta como si ese miembro se reemplazara con la matriz más larga (con el mismo tipo de elemento ) que no haría la estructura más grande que el objeto al que se accede; el desplazamiento de la matriz seguirá siendo el del miembro de matriz flexible, incluso si esto difiriera del de la matriz de reemplazo. Si esta matriz no tiene elementos, se comporta como si tuviera un elemento, pero el comportamiento no está definido si se intenta acceder a ese elemento o generar un puntero pasado.

6
+1

más barata respuesta correcta que he visto en stackoverflow alguna vez: D – Gewure

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/19065624) – grizzthedj

7

Es un truco común C para declarar lo que puede llamarse una longitud de matriz variable (donde se define el tamaño en el momento de la asignación

Ejemplo:

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

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

De esta manera tiene una estructura definición de sus datos, que también almacena la longitud de la matriz para propósitos obvios de conveciencia, pero no está limitado por el tamaño fijo que generalmente se asocia con una estructura

Ejemplo tomado de here (también más información)

Cuestiones relacionadas