2013-07-12 26 views
8

Yineleme sırasında değişkenlerin nasıl oluşturulduğundan ve bellekte saklandığından emin değilim. Aşağıda C Primer Plus alınan bir örnek:Değişkenler yinelemede bellekte nasıl saklanır?

Seviye 3: çıkışını verir

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

0x3ce1f8bc

Seviye 4: 0x3ce1f89c

SEVİYE 4: 0x3ce1f89c

LEVEL 3: 0x3ce1f8bc

Orijinal işlev çağrısı için yerel olan "n" değişkeni, birinci (ve yalnızca) özyinelemeli aramanın sekansından sonraki bir adreste olduğu gibi görünür. Neden?

Bir işlevi çağırdığımda, onun resmi parametreleri bildirilen ve kendisine gönderilen gerçek argüman açısından tanımlanmış değil midir? Bu, ikinci çağrının (yinelemeli) çağrısından önce n numaralı yerel çağrının tamsayısının yaratıldığı anlamına gelmez mi? İkinci aramanın n ilk çağrısından önceki bir adresi nasıl olabilir?

+0

Farkı görmek için * çok * daha düşük bir değer (-99 gibi) kullanın. – Makoto

cevap

8

Bunun nedeni, özyinelemeli işlev çağrıları sırasında oluşturulan yerel otomatik değişkenlerin yığında depolanması ve yığının x86 dahil olmak üzere çoğu platformda daha yüksek bir adresden aşağı doğru büyür olmasıdır. Böylece işlemin daha sonra çağrıldığı bir işlev, daha önceki bir işlev çağrısından saklanan değişkenlerden "alt" bir adrese sahip değişkenlere sahip olacaktır.

+1

+1, çünkü bu cevap, değişkenlerin her bir işlev çağrısı ile oluşturulduğundan bahseder – tay10r

3

Yerel değişkenler (işlev argümanları dahil) yığında saklanır. yığını gözlemlemek budur, alt adresleri doğru büyür:

Memory diagram

Böylece derine özyinelemede gitmek, düşük adresleri olacaktır.

0

Bunun nedeni, yerel değişkenlerin yığında bulunması ve yığının yüksek bellekten düşük belleğe ayrılmasıdır. Yani, daha önce bir değişken tanımlanırsa, adresi o kadar yüksek olur.