Array dinámico genérico en C sin struct ni capacidad almacenada

Fuentes: A generic dynamic array in C that stores no capacity and needs no struct

Un desarrollador ha compartido una implementación de array dinámico genérico en C que prescinde de estructuras y del almacenamiento explícito de capacidad. La técnica utiliza un array de dos punteros: el primero guarda la longitud como uintptr_t, y el segundo apunta a los datos. Así, declaraciones como int *vec[2] = { 0 } producen un array dinámico vacío de enteros, sin necesidad de nombrar una estructura separada.

La macro vec_push añade un elemento al final y devuelve verdadero si tiene éxito. El código requiere C23 y expresiones de sentencia (extensión de GNU C). La capacidad no se almacena, sino que se calcula bajo demanda: cuando la longitud es cero o una potencia de dos, se invoca realloc para asignar el siguiente tamaño potencia de dos mayor que la longitud. Esto evita llevar un campo de capacidad, pero dificulta la reserva manual de elementos; si el usuario intenta reservar espacio de antemano, la macro lo ignora al alcanzar la siguiente potencia de dos.

Esta implementación es útil para programadores en C que buscan un array dinámico genérico sin sobrecarga de estructuras con nombre. Como limitación, depende del comportamiento definido por la implementación de uintptr_t: la longitud debe poder leerse y escribirse desde un puntero sin pérdida. Además, al no almacenar capacidad, no es posible una reserva eficiente de elementos, lo que puede generar realojos más frecuentes de lo necesario.