Los tipos de datos de estructura de C pueden terminar con un miembro de matriz flexible [1] sin un tamaño especificado:
struct vectord { corta 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 los miembros de la estructura };
Por lo general, estas estructuras sirven como encabezado en una asignación de memoria variable más grande :
estructura 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 sizeof
operador en tal struct
da el tamaño de la estructura como si el miembro de matriz flexible estuviera vacío. Esto puede incluir acolchado añadido para acomodar el miembro flexible; el compilador también es libre de reutilizar dicho relleno como parte de la propia matriz. [2]
Es común asignar bytes.sizeof(struct) + array_len*sizeof(array element)
Esto no es incorrecto, sin embargo, puede asignar algunos bytes más de los necesarios: el compilador puede estar reutilizando parte del relleno que se incluye en sizeof(struct)
. Si esto es una preocupación, hay macros disponibles [3] para calcular el tamaño mínimo mientras se asegura 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 a través de indexación ( arr[i]
) o offsetof
no sizeof
.
Disponibilidad
Los miembros de la matriz flexible se estandarizaron oficialmente en C99 . [4] En la práctica, los compiladores (por ejemplo, GCC , [5] Microsoft Visual C [6] ) los proporcionaron mucho antes de que se estandarizara C99.
Los miembros de la matriz flexible no son oficialmente parte de C ++ , pero las extensiones de lenguaje [7] están ampliamente disponibles.
Referencias
- ^ "Funciones de C menos conocidas" . Consultado el 30 de diciembre de 2014 .
- ^ "miembro de matriz flexible" . Blog de Jens Gustedt . 14 de marzo de 2011 . Consultado el 9 de octubre de 2018 .
- ^ "P99: miembros de matriz flexible" . p99.gforge.inria.fr . Consultado el 9 de octubre de 2018 .
- ^ C99 sección §6.7.2.1, artículo 16, página 103, http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
- ^ "Longitud cero - Usando la colección de compiladores GNU (GCC)" . Consultado el 30 de diciembre de 2014 .
- ^ "Declaraciones de estructura" . Microsoft . Consultado el 25 de abril de 2020 .
- ^ Por ejemplo, "Matrices (C ++)" . Microsoft . Consultado el 25 de abril de 2020 .
Una matriz de tamaño cero es legal solo cuando la matriz es el último campo en una estructura o unión y cuando las extensiones de Microsoft (/ Ze) están habilitadas.