No, usar flexible array members en C no es una mala práctica.
Esta característica de idioma se estandarizó por primera vez en ISO C99, 6.7.2.1 (16). Para el estándar actual, ISO C11, se especifica en la Sección 6.7.2.1 (18).
Puede utilizarlos como esto:
struct Header {
size_t d;
long v[];
};
typedef struct Header Header;
size_t n = 123; // can dynamically change during program execution
// ...
Header *h = malloc(sizeof(Header) + sizeof(long[n]));
h->n = n;
Como alternativa, puede asignarlo como esto:
Header *h = malloc(sizeof *h + n * sizeof h->v[0]);
Tenga en cuenta que sizeof(Header)
incluye bytes de relleno eventuales, por lo tanto, la siguiente asignación es incorrecta y puede producir un desbordamiento de búfer:
Header *h = malloc(sizeof(size_t) + sizeof(long[n])); // invalid!
Una estructura con af Los miembros lexibles de la matriz reducen el número de asignaciones en 1/2, es decir, en lugar de 2 asignaciones para un objeto struct, solo necesitas 1. Por lo tanto, si tienes que asignar una gran cantidad de instancias struct, mejorarás de forma medible el tiempo de ejecución de tu programa (por un factor constante).
En contraste con eso, el uso de construcciones no estandarizadas para miembros de matriz flexibles que producen un comportamiento indefinido (por ejemplo, como en long v[0];
o long v[1];
) obviamente es una mala práctica. Por lo tanto, como cualquier comportamiento indefinido, esto debería evitarse.
Desde que ISO C99 fue lanzado en 1999, hace casi 20 años, luchar por la compatibilidad con ISO C89 es un argumento débil.
siempre que esté codificando en un sistema donde STL es compatible. –
C++ pero no STL ... ¡No es una idea agradable! – Roddy
Nombre un compilador que acepte matrices de longitud cero. (Si la respuesta fue GCC, ahora nombre otra). No está sancionado por el estándar C. –