Arrays en C: entre datos y punteros

Fuentes: C array types are weird
Arrays en C: entre datos y punteros
Imagen generada con IA

Los arrays en C son una fuente común de confusión para desarrolladores debido a su comportamiento híbrido entre tipos de datos y punteros. Técnicamente, un array T[n] representa una secuencia contigua de valores en memoria, pero en la práctica se 'decomponen' (decay) en punteros T* en casi todas las expresiones. Esto permite tratarlos como punteros, pero genera inconsistencias importantes. El caso más notable es el operador sizeof: sizeof(arr) devuelve el tamaño total de la memoria reservada (sizeof(T) * n), mientras que sizeof(puntero) devuelve solo el tamaño de la dirección. Además, al pasar arrays a funciones, la información del tamaño se pierde, ya que el argumento se interpreta como puntero simple. Para preservar la longitud, se debe pasar un puntero al array completo (T (*)[n]), aunque la sintaxis es engorrosa.

Este comportamiento es vital en programación de sistemas de bajo nivel y sistemas embebidos, donde el control explícito sobre la memoria es crítico. A diferencia de los structs, los arrays no permiten 'slicing' intuitivo, y su manejo depende de la intuición del programador. El autor sugiere que C debería pasar arrays por valor (como structs) para mayor claridad, aunque esto implicaría copias de memoria. Como alternativa parcial, herramientas como el depurador GDB introducen el operador @ para reconstruir arrays desde punteros, reflejando una arquitectura común donde se ocultan metadatos detrás de manejadores opacos. Además, las funciones en C comparten esta característica de 'decay' a punteros, pero con diferencias sutiles en la desreferenciación que añaden más complejidad al lenguaje.