Post by raulTengo serias dudas acerca de la gestión de memoria en C.
C ne gestiona la memoria, lo hace el sistema operativo.
Post by raulTengo un programa que hace poca cosa,
...
Post by raulcomo puedo saber el tamaño de memoria virtual que voy a necesitar
durante la ejecución?
No lo puedes, ni importa: estos días, un programa gasta un montón de memoria
para nada, mejor dicho, para cosas irrelevantes (como puede ser bibliotecas
dinámicas, tener hilos, prevención de los agujeros de mala programación como
puden ser desbordiamiento de búfers, compatibilidad con arquitectura
orientadas a objectos y varios otras funcionalidades que este programa no
necesite).
Además, la memoria virtual es eso, virtual. La única cosa relevante que
puede importarte es si va a desbordar del marco, el espacio de adresas
otorgado per la arquitectura del sistema; particularamente el tamaño de la
pila, esos días.
Y claro está que si hay desbordamiento, no lo será por un programa que hace
poca cosa...
Aparte de estas consideraciones, el tamaño lo debes calcular considerando el
momento más critico del programa: es decir, al más profundo de las
recursiones (que te dará el tamaño de la "pila"), sumandolo el total de las
alocaciones dinámicas (malloc que no ha sido liberado por free) y por
supuesto las cosas estáticas como el código y los globales. Y como hay dos
contadores independientes, puede ser que el computo sea dificil, llamando a
iteraciones o dependiente de los argumentos.
En tu caso es senzillo (que no fácil): hay solo dos momentos potenciales
criticos: en el scanf y en el printf. El segundo es más o menos previsible,
hay que sumar las pilas de las funciones que se utilizán, y los búferes de
salida de *stdout y él de entrada de *stdin (que está alocado
dinámicamente), más el almacimiento de a y todo lo estático. Pero el computo
del tamaño para el scanf es mucho más complicado, por que no sabes todo de
las entradas que te van a pasar; por ejemplo, si te pasan una cadena de un
millón de '0', algunas implementaciones pueden pedir almacenar todos estos
'0' antes de hacer la conversión, y otros no lo hicierón.
Antoine