Estoy a punto de terminar de leer K & R, y esa es toda la C que conozco. Toda mi compilación se hace desde la línea de comandos de Windows utilizando MinGW, y no tengo conocimiento de los métodos avanzados de depuración (de ahí el comentario "depuración de ghetto" en mi segundo programa a continuación).Descripción de asignación de memoria, programa de prueba fallando
Estoy tratando de hacer algunos pequeños programas de prueba para ayudarme a entender mejor cómo funciona la asignación de memoria. Estos primeros dos programas no usan malloc o libre, solo quería ver cómo se asigna y desasigna la memoria para matrices estándar locales a una función. La idea es que mire el uso de la RAM de los procesos en ejecución para ver si se corresponde con lo que entiendo. Para este primer programa a continuación, funciona como esperaba. La función alloc_one_meg()
asigna e inicializa 250,000 enteros de 4 bytes, pero ese MB se desasigna tan pronto como la función retorna. Entonces, si llamo a esa función 1000000 veces seguidas, nunca debería ver que mi uso de RAM vaya mucho más allá de 1MB. Y funciona.
#include <stdio.h>
#include <stdlib.h>
void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
}
main()
{
int i;
for (i=0; i<1000000; i++) {
alloc_one_meg();
}
}
Para este segundo programa más adelante, la idea era no permitir que la función para salir, para tener 1000 copias de la misma función en ejecución a la vez, lo que he logrado con la recursividad. Mi teoría era que el programa consumiría 1GB de RAM antes de que se desasignara todo después de que terminara la recursión. Sin embargo, no pasa el segundo ciclo a través de la recursión (ver mi comentario de depuración del gueto). El programa falla con un mensaje bastante no informativo (para mí) (un mensaje emergente de Windows que dice que ____. Exe ha encontrado un problema). Por lo general, siempre puedo llegar al fondo de las cosas con mi método de depuración de guetos ... pero no está funcionando aquí. Estoy perplejo. ¿Cuál es el problema con este código? ¡Gracias!
#include <stdio.h>
#include <stdlib.h>
int j=0;
void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
j++;
printf("Loop %d\n", j); // ghetto debug
if (j<1000) {
alloc_one_meg();
}
}
main()
{
alloc_one_meg();
}
pregunta de seguimiento publicado here.
Y ahora que tiene un bloqueo de desbordamiento de pila, tiene una mejor comprensión de la memoria. Es curioso cómo las cosas funcionan así. –
Sí, soy nuevo en la programación, pero no soy nuevo en la idea de probar. ¡Soy un ingeniero y un USUARIO de software pesado, y sé muy bien que romper las cosas es la mejor manera de entenderlas! :-) – The111