Я почти закончил читать K&R, и это все, что я знаю о Си. Вся моя компиляция выполняется из командной строки Windows с использованием MinGW, и я не знаю продвинутых методов отладки (отсюда комментарий «отладка гетто» в моей 2-й программе ниже).
Я пытаюсь сделать несколько небольших тестовых программ, чтобы помочь мне лучше понять, как работает распределение памяти. Эти первые две программы не используют malloc или free, я просто хотел посмотреть, как память выделяется и освобождается для стандартных массивов, локальных для функции. Идея состоит в том, что я наблюдаю за использованием ОЗУ запущенными процессами, чтобы увидеть, соответствует ли оно тому, что я понимаю. Для этой первой программы ниже она работает так, как я ожидал. Функция alloc_one_meg()
выделяет и инициализирует 250 000 4-байтовых целых чисел, но этот МБ освобождается, как только функция возвращается. Поэтому, если я вызову эту функцию 1000000 раз подряд, я никогда не увижу, что использование моей оперативной памяти превышает 1 МБ. И это работает.
#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();
}
}
Для этой второй программы, представленной ниже, идея заключалась в том, чтобы не допустить выхода функции, чтобы одновременно выполнялось 1000 копий одной и той же функции, чего я добился с помощью рекурсии. Моя теория заключалась в том, что программа будет потреблять 1 ГБ ОЗУ, прежде чем она освободит все это после завершения рекурсии. Однако он не проходит второй цикл рекурсии (см. мой комментарий по отладке гетто). Программа вылетает с довольно неинформативным (для меня) сообщением (всплывающее окно Windows о том, что ____.exe столкнулся с проблемой). Обычно я всегда могу добраться до сути вещей с помощью своего метода отладки из гетто... но здесь он не работает. Я в тупике. В чем проблема с этим кодом? Спасибо!
#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();
}
Последующий вопрос опубликован здесь.