| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Рекурсивные функции и стек |
| Автор: FiMa1 2.8.2007, 14:44 | ||
| Доброго здравия, друзья! Есть рекурсивная функция, к примеру такая, как показано ниже. Как известно, при очередном вызове из функции самой себя в стек сохраняются значения параметров функции (в нашем случае a, arrsize и n), ну и адреса возврата. Вопрос: каково объяснение тому, что указатели, переданные в функцию в качестве аргументов (в примере имя массива a, которое может быть использовано в качестве указателя, но можно и явно ввести указатель) не пересохраняются в стек? Спасибо!
|
| Автор: bsa 2.8.2007, 15:09 |
| попробуй вместо int a[] использовать const int *a; |
| Автор: FiMa1 2.8.2007, 15:17 | ||||||
Нее, та же картина.. Попробовал ввести еще один аргумент - const int *p - то же самое.. Я, собственно, даже легко допускаю, что такое поведение нормальное, но все же почему.. Все же указатель - то же переменная, получается, если мне понадобиться работать с адресом внутри функции, то я, в каждом новом рекурсивном вызове функции, буду перезаписывать одно и тоже значение... Добавлено через 1 минуту и 20 секунд
Ну, под дебаггером посмотрел все значения агрументов при каждом очередном входе в функцию... Да, тоже подумалось про оптимизацию.. |
| Автор: bsa 2.8.2007, 15:36 |
| надо было смотреть не значения, а адреса переменных. А лучше дизассемблером смотреть. |
| Автор: FiMa1 2.8.2007, 15:43 | ||
Значения переменных-указателей - адреса, они не перезаписывались в стек... Кстати, для константных указателей вопрос отпадает, я и так их значения поменять в функции не смогу. |
| Автор: Sartorius 2.8.2007, 15:46 | ||
| FiMa1, bsa говорит о том, что бы посмотреть адреса этих адресов. PS Сильно сомневаюсь, что есть компиляторы поддерживающие оптимизацию передачи неизменных параметров в случае рекурсии, т.к. они легко могут быть изменены неявно Неа . все сохраняется вроде
|
| Автор: FiMa1 2.8.2007, 15:57 | ||
Sartorius, ага я уже понял, не успел вот только оправдаться, что такую фигню сморозил... bsa, извини малость. Всем спасибо! |