¿Cuál es el propósito de una matriz de longitud cero en una estructura? [duplicate]

3 minutos de lectura

Cuando busco el código del kernel de Linux, encontré el siguiente código:

   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];
};

Tenga en cuenta que la última variable “supervisor_stack”, es una matriz de longitud cero, ¿cuál es su uso? ¡Gracias por adelantado!

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

    – Ryan Fung

    31 de julio de 2012 a las 5:58

  • gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

    – Neo

    31 de julio de 2012 a las 5:59

avatar de usuario
daniel pescador

Es la versión anterior a C99 de un miembro de arreglo flexible, ofrecido por GCC como una extensión.

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

__u8  supervisor_stack[];

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

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

En el párrafo 18 de 6.7.2.1, la norma (borrador N1570) los describe:

Como caso especial, el último elemento de una estructura con más de un miembro con nombre puede tener un tipo de matriz incompleta; esto se denomina 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 final de lo que implicaría la omisión. Sin embargo, cuando un . (o ->) tiene un operando izquierdo que es (un puntero a) una estructura con un miembro de matriz flexible y el operando derecho nombra ese miembro, se comporta como si ese miembro fuera reemplazado con la matriz más larga (con el mismo tipo de elemento) que no hacer que la estructura sea 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 fuera diferente al de la matriz de reemplazo. Si esta matriz no tuviera 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 uno más allá.

Es un truco común de C declarar lo que se puede llamar una matriz de longitud variable (donde 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 definición de estructura de sus datos, que también almacena la longitud de la matriz por razones de conveniencia obvias, pero no está limitado por el tamaño fijo que generalmente se asocia con una estructura.

Ejemplo tomado de aquí (también más información allí)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad