Nie jestem pewien, jak zmienne są tworzone i przechowywane w pamięci podczas rekursji. Poniżej znajduje się przykład wzięty z C Primer Plus:W jaki sposób zmienne są przechowywane w pamięci w rekursji?
#include <stdio.h>
void recursiontest(int);
int main(){
recursiontest(3);
return 0;
}
void recursiontest(int n){
printf("Level %d : %#x\n", n, &n);
if(n < 4)
recursiontest(n + 1);
printf("LEVEL %d : %#x\n", n, &n);
return;
}
co daje wyjście:
Poziom 3: 0x3ce1f8bc
Poziom 4: 0x3ce1f89c
POZIOM 4: 0x3ce1f89c
POZIOM 3: 0x3ce1f8bc
Wygląda na to, że zmienna "n" mająca lokalny charakter w stosunku do pierwotnego wywołania funkcji ma adres sekwencyjnie późniejszy niż pierwszego (i jedynego) wywołania rekursywnego. Dlaczego?
Kiedy wywołuję funkcję, czy jej formalne parametry nie są zadeklarowane i zdefiniowane w kontekście faktycznego argumentu przekazanego do niej? Czy nie oznacza to, że liczba całkowita n lokalna dla pierwszego połączenia jest tworzona przed drugim (rekursywnym) wywołaniem? W jaki sposób n drugiego połączenia może mieć adres wcześniejszy niż pierwsze połączenie?
Użyj * dużo * niższej wartości n (np. -99), aby zobaczyć różnicę. – Makoto