Hasta ahora, todos los tipos de datos (estándares o definidos por el usuario) y arreglos que podían ser declarados, debían ser declarados con un tamaño fijo en tiempo de compilación17. Es decir que el tamaño de todos los datos contenidos en un programa debería ser siempre conocido antes de su ejecución.
Esto hace muy seguro al leguaje C en cuanto al uso de memoria, pero no siempre resulta en la forma óptima o más práctica de utilizar el espacio. Por ejemplo, una de las primeras tareas que enfrentamos al comenzar a programar es leer el texto que un usuario ingresa, como su nombre. En ese contexto nos preguntamos cuántos caracteres reservar para el nombre, que coincidirá con la cantidad de letras más uno para el carácter nulo de la cadena.
Sin embargo, no podemos conocer esto en tiempo de compilación. De hecho, podemos asegurar que será siempre distinto para distintas personas. La estrategia que adoptamos es suponer que habrá siempre una cota máxima y todos los nombres tendrán menos letras. Esto funciona hasta que aparece el Sr. Hubert Blaine Wolfeschlegelsteinhausenbergerdorff y arruina nuestros planes.
Algunos ejemplos más pertinentes son el ingreso de grandes volúmenes de datos por algún periférico; el manejo de archivos guardados en almacenamiento permanente, que pueden tener tamaños muy grandes y en general son desconocidos por el programa hasta que comienza a manipularlos; los programas numéricos que utilizan matrices o arreglos, en ocasiones cuyos tamaños dependen de resultados de cálculos intermedios; programas que deben adaptarse eficientemente a algunos parámetros de configuración. En todas estas ocasiones, y muchas más, puede convenir declarar el tamaño de las variables en tiempo de ejecución.