Miembro de matriz flexible

Característica del lenguaje C en la que una estructura puede contener como último miembro una matriz sin tamaño especificado

Los tipos de datos de estructura C pueden terminar con un miembro de matriz flexible [1] sin tamaño especificado:

struct vectord { short len ​​; // debe haber al menos otro miembro de datos double arr []; // el miembro de la matriz flexible debe ser el último // El compilador puede reservar espacio de relleno adicional aquí, como puede hacerlo entre miembros de la estructura };         

Normalmente, estas estructuras sirven como encabezado en una asignación de memoria variable más grande :

struct vectord * vector = malloc (...); vector -> len = ...; for ( int i = 0 ; i < vector -> len ; i ++ ) vector -> arr [ i ] = ...; // usa de forma transparente el tipo correcto (doble)                  

Efecto sobre el tamaño de la estructura y el relleno

El sizeofoperador en tal a structda el tamaño de la estructura como si el miembro de la matriz flexible estuviera vacío. Esto puede incluir relleno agregado para acomodar el miembro flexible; el compilador también tiene la libertad de reutilizar dicho relleno como parte de la matriz misma. [2]

Es común asignar bytes. sizeof(struct) + array_len*sizeof(array element)

Esto no es incorrecto, pero puede asignar algunos bytes más de los necesarios: el compilador puede estar reutilizando parte del relleno incluido en sizeof(struct). Si esto es un problema, hay macros disponibles [3] para calcular el tamaño mínimo y garantizar que el relleno del compilador no se interrumpa.

Como la matriz puede comenzar en el relleno antes del final de la estructura, siempre se debe acceder a su contenido mediante indexación ( arr[i]) o offsetof, no sizeof.

Disponibilidad

Los miembros de matriz flexibles se estandarizaron oficialmente en C99 . [4] En la práctica, los compiladores (por ejemplo, GCC , [5] MSVC [6] ) los proporcionaron mucho antes de que se estandarizara C99.

Los miembros de matrices flexibles no son oficialmente parte de C++ , pero las extensiones del lenguaje [7] están ampliamente disponibles.

Referencias

  1. ^ "Características menos conocidas de C" . Consultado el 30 de diciembre de 2014 .
  2. ^ "miembro de matriz flexible". Blog de Jens Gustedt . 14 de marzo de 2011. Consultado el 9 de octubre de 2018 .
  3. ^ "P99: Miembros de matriz flexibles". p99.gforge.inria.fr . Consultado el 9 de octubre de 2018 .
  4. ^ C99 sección §6.7.2.1, ítem 16, página 103, http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
  5. ^ "Longitud cero: uso de la colección de compiladores GNU (GCC)" . Consultado el 30 de diciembre de 2014 .
  6. ^ "Declaraciones de estructura". Microsoft . Consultado el 25 de abril de 2020 .
  7. ^ Por ejemplo, "Arrays (C++)". Microsoft . Consultado el 25 de abril de 2020 . Una matriz de tamaño cero solo es legal cuando la matriz es el último campo de una estructura o unión y cuando las extensiones de Microsoft (/Ze) están habilitadas.
Obtenido de "https://es.wikipedia.org/w/index.php?title=Miembro_de_matriz_flexible&oldid=1193014376"