При осуществлении рекурсии ф-ии
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); <- запихнуть параметр в стек
-> вытащить из стека
На самом деле никто не куда не запихивается и не вытаскивается, просто увеличивается только счетчик стека (регистр в проце не помню) и по адресу этого увеличенного счетчика заносится значение, при выходе из функции счетчик соответственно уменьшиться.
Память для локальных переменных выделяется в стеке.
> Что происходит со старыми?
Старые тоже остаются в стеке.
> Можно ли таким образом заполнить всю оп?
Можно переполнить память выделенную под стек. Всю нет.
> а здесь мы используем один и тот же?
Не мы а программа
aaa (x); <- запихнуть параметр в стек
-> вытащить из стека
putchar ('\n'); <- запихнуть параметр в стек
-> вытащить из стека
aaa (x); <- запихнуть параметр в стек
-> вытащить из стека
На самом деле никто не куда не запихивается и не вытаскивается, просто увеличивается только счетчик стека (регистр в проце не помню) и по адресу этого увеличенного счетчика заносится значение, при выходе из функции счетчик соответственно уменьшиться.
потому как в первом примере ты каждый раз создаешь новые переменные а во втором используешь одну и ту же
в первом у тебя нет условия выхода из цикла, естественно память будет быстро заполнена
в первом у тебя нет условия выхода из цикла, естественно память будет быстро заполнена
всё зависит от ОС и её менеджера памяти, а так же от самого процессора на котором это выполняется и режима его работы. если рассматривать интел/амд в реальном режиме без ОС, то в 1 примере легко всю память забить, ОС же (нормальная) + переход в виртуальный режим не даст этого сделать, т. к. на каждый процесс выделяется некоторое количество _виртуальной_ памяти, вот её забить можно, но закончится это не так фатально, как в первом случае, т. е. ОС просто выкинет процесс с ошибкой отсутствия памяти.
по поводу выделяемых адресов - в обоих примерах память под переменные выделяется в стэке процесса, т. е. в случае рекурсии величина этого стэка растёт с каждым рекурсивным вызовом, поэтому и адреса выделенных внутренних переменных всё время увеличиваются (или уменьшаются, зависит от того в какую сторону стэк растёт) . во втором же случае после 1-го вызова стэк возвращается в исходное состояние, поэтому при втором вызове той же функции (да можно и не той же, можно вызвать подобную с таким же количеством и типом аргументов) адрес аргумента будет таким же, как в 1-ом вызове.
по поводу выделяемых адресов - в обоих примерах память под переменные выделяется в стэке процесса, т. е. в случае рекурсии величина этого стэка растёт с каждым рекурсивным вызовом, поэтому и адреса выделенных внутренних переменных всё время увеличиваются (или уменьшаются, зависит от того в какую сторону стэк растёт) . во втором же случае после 1-го вызова стэк возвращается в исходное состояние, поэтому при втором вызове той же функции (да можно и не той же, можно вызвать подобную с таким же количеством и типом аргументов) адрес аргумента будет таким же, как в 1-ом вызове.
Похожие вопросы
- не получается создать специализацию (спец ф-ию) в codeblocks 10,05. C++
- Стоит ли использовать рекурсию в целом? (+)
- Рекурсия, возникли проблемы с изучением рекурсии, не могли бы подсказать книги или видео про обьяснение рекурсии
- Ошибка в программе delphi. Рекурсия
- Вопрос тем, кто хорошо знаком с рекурсией. Язык Си (но это второстепенно)...
- Подскажите практическую задачку на углубленное понимание что такое рекурсия?
- Сравнить 2 массива через рекурсию
- Задачка на Delphi, рекурсия...
- Матрица M*N, состоящая из "0" и "1", найти наибольшую фигуру из единиц с помощью рекурсии. С++
- Как быть с многоразмерными массивами? Рекурсия?