2013-07-12 20 views
8

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?

+0

Użyj * dużo * niższej wartości n (np. -99), aby zobaczyć różnicę. – Makoto

Odpowiedz

8

Wynika to z faktu, że lokalne zmienne automatyczne tworzone podczas rekursywnych wywołań funkcji są przechowywane na stosie, a stos "rośnie" z wyższego do niższego adresu na większości platform, w tym na x86. Tak więc funkcja, która jest wywoływana w dalszej części procesu, będzie miała zmienne o "niższym" adresie niż zmienne przechowywane z wcześniejszego wywołania funkcji.

+1

+1, ponieważ ta odpowiedź wspomina, że ​​zmienne są tworzone przy każdym wywołaniu funkcji – tay10r

3

Zmienne lokalne (w tym argumenty funkcji) są przechowywane w stosie. Stos rośnie w kierunku niższych adresów, co jest, co można zaobserwować:

Memory diagram

Zatem, im głębiej idziesz w rekursji, tym niższa będzie adresy.

0

Jest tak dlatego, że zmienne lokalne znajdują się na stosie, a stos jest przydzielany z pamięci wysokiej do niskiej. To znaczy, im wcześniej zdefiniowana jest zmienna, tym wyższy będzie jej adres.

Powiązane problemy