Другие языки программирования и технологии

Рекурсия ф-ии

При осуществлении рекурсии ф-ии
main ()
{
int x, y;
printf ("&x = %u, &y = %u\n", &x, &y);
txSleep (200);
main ();
}
Оператива каждый раз выдает новые адреса для x и y. Что происходит со старыми? Можно ли таким образом заполнить всю оп?
> Оператива каждый раз выдает новые адреса для x и y. Что происходит со старыми?
Память для локальных переменных выделяется в стеке.

> Что происходит со старыми?
Старые тоже остаются в стеке.

> Можно ли таким образом заполнить всю оп?
Можно переполнить память выделенную под стек. Всю нет.

> а здесь мы используем один и тот же?
Не мы а программа
aaa (x); <- запихнуть параметр в стек
-> вытащить из стека
putchar ('\n'); <- запихнуть параметр в стек
-> вытащить из стека
aaa (x); <- запихнуть параметр в стек
-> вытащить из стека

На самом деле никто не куда не запихивается и не вытаскивается, просто увеличивается только счетчик стека (регистр в проце не помню) и по адресу этого увеличенного счетчика заносится значение, при выходе из функции счетчик соответственно уменьшиться.
ПД
Паша Дащенко
57 637
Лучший ответ
потому как в первом примере ты каждый раз создаешь новые переменные а во втором используешь одну и ту же

в первом у тебя нет условия выхода из цикла, естественно память будет быстро заполнена
Денис Толкунов
Денис Толкунов
68 014
всё зависит от ОС и её менеджера памяти, а так же от самого процессора на котором это выполняется и режима его работы. если рассматривать интел/амд в реальном режиме без ОС, то в 1 примере легко всю память забить, ОС же (нормальная) + переход в виртуальный режим не даст этого сделать, т. к. на каждый процесс выделяется некоторое количество _виртуальной_ памяти, вот её забить можно, но закончится это не так фатально, как в первом случае, т. е. ОС просто выкинет процесс с ошибкой отсутствия памяти.
по поводу выделяемых адресов - в обоих примерах память под переменные выделяется в стэке процесса, т. е. в случае рекурсии величина этого стэка растёт с каждым рекурсивным вызовом, поэтому и адреса выделенных внутренних переменных всё время увеличиваются (или уменьшаются, зависит от того в какую сторону стэк растёт) . во втором же случае после 1-го вызова стэк возвращается в исходное состояние, поэтому при втором вызове той же функции (да можно и не той же, можно вызвать подобную с таким же количеством и типом аргументов) адрес аргумента будет таким же, как в 1-ом вызове.