2013-07-12 2 views
8

Non sono sicuro di come vengono create e memorizzate le variabili durante la ricorsione. Di seguito è riportato un esempio tratto dalla C Primer Plus:Come vengono memorizzate le variabili nella ricorsione?

#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; 
} 

che produce l'uscita:

Livello 3: 0x3ce1f8bc

Livello 4: 0x3ce1f89c

LIVELLO 4: 0x3ce1f89c

LIVELLO 3: 0x3ce1f8bc

Sembra che la variabile "n" locale alla chiamata della funzione originale sia di un indirizzo sequenzialmente successivo a quello della prima (e unica) chiamata ricorsiva. Perché?

Quando chiamo una funzione, i suoi parametri formali non sono dichiarati e definiti in termini dell'argomento effettivamente passato ad esso? Non significherebbe che l'intero n locale alla prima chiamata viene creato prima della seconda chiamata (ricorsiva)? Come potrebbe la n della seconda chiamata avere un indirizzo prima della prima chiamata?

+0

Utilizzare un valore * molto * più basso n (come -99) per vedere davvero una differenza. – Makoto

risposta

8

Questo perché le variabili automatiche locali create durante le chiamate della funzione ricorsive vengono memorizzate nello stack e lo stack cresce "in basso" da un indirizzo superiore a quello inferiore sulla maggior parte delle piattaforme, incluso x86. Pertanto una funzione chiamata più avanti nel processo avrà variabili con un indirizzo "inferiore" rispetto alle variabili memorizzate da una chiamata di funzione precedente.

+1

+1 perché questa risposta indica che le variabili vengono create con ciascuna chiamata di funzione – tay10r

3

Le variabili locali (inclusi gli argomenti delle funzioni) sono memorizzate nello stack. Lo stack cresce verso gli indirizzi più bassi, che è quello che si osserva:

Memory diagram

Così, il più profondo si va nella ricorsione, minore è l'indirizzo saranno.

0

Questo perché le variabili locali sono in pila, e la pila viene allocato da memoria alta di memoria insufficiente. Vale a dire, prima si definisce una variabile, più alto sarà l'indirizzo.