SORU
4 Kasım 2009, ÇARŞAMBA


Yığın aşağı veya yukarı çıkar mı?

C bu kod parçası var:

int s=10; int s=5; int a[3];

printf("Address of a: %d\n",(int)a);
printf("Address of a[1]: %d\n",(int)&a[1]);
printf("Address of a[2]: %d\n",(int)&a[2]);
printf("Address of q: %d\n",(int)&q);
printf("Address of s: %d\n",(int)&s);

Çıktı

Address of a: 2293584
Address of a[1]: 2293588
Address of a[2]: 2293592
Address of q: 2293612
Address of s: 2293608

Yani, bir[2], bellek adresleri her 4 bayt artar. Ama s s, bellek adresleri 4 byte ile azaltılır.

Ben 2 şey merak ediyorum:

  1. Yığın aşağı veya yukarı çıkar mı? (Bu durumda bana hem benziyor)
  2. Ne[2] ve q arasında olmasına bellek adresleri? Bir büyük var neden bellek farkı var? (20 bayt).

Not: Bu Ödev sorusu değil. Yığının nasıl çalıştığını merak ediyorum. Herhangi bir yardım için teşekkürler.

CEVAP
7 Kasım 2009, CUMARTESİ


Yığının davranış (büyümek ya da büyüyen) yığın (ya da aktivasyon kaydı) nasıl düzenlenir, uygulama ikili arabirimi (ABI) ve bağlıdır.

Ömrü boyunca bir program OS gibi diğer programlar ile iletişim kurmak için bağlıdır. ABİ bir program başka bir program ile iletişim kurmak nasıl belirler.

Farklı mimariler için yığın her iki şekilde büyüyebilir, ama bir mimarlık için tutarlı olacaktır. this wiki bağlantısını kontrol edin. Ama, yığın büyüme mimarlık ABİ tarafından karar verilir.

Eğer CABASI ABİ alırsan, örneğin, çağrı şöyle tanımlanmıştır yığını.

Bize bu işlev düşünelim 'fn1' aramaları fn2'. Görüldüğü gibi çerçeve yığını şimdi 'fn2' aşağıdaki gibidir:

direction of     |                                 |
  growth of       ---------------------------------  
   stack         | Parameters passed by fn1(caller)|
from higher addr.|                                 |
to lower addr.   | Direction of growth is opposite |
      |          |   to direction of stack growth  |
      |           ---------------------------------  <-- SP on entry to fn2
      |          | Return address from fn2(callee) | 
      V           ---------------------------------  
                 | Callee saved registers being    | 
                 |   used in the callee function   | 
                  --------------------------------- 
                 | Local variables of fn2          |
                 |(Direction of growth of frame is |
                 | same as direction of growth of  |
                 |            stack)               |
                  ---------------------------------  
                 | Arguments to functions called   |
                 | by fn2                          |
                  ---------------------------------  <- Current SP after stack 
                                                        frame is allocated

Şimdi yığın aşağı doğru büyür görebilirsiniz. Eğer değişkenleri fonksiyonun yerel kareye ayrılmış, değişken adresleri aslında aşağı doğru büyür. Derleyici bellek ayırma için değişkenleri sırasına karar verebilir. (Senin durumunda da olabilir '' veya 's' ilk yığın bellek ayrılır. s Ama, genel olarak derleyici değişkenleri Bildirgesi isteğe göre yığın bellek ayırma).

Ama diziler halinde tahsisi sadece tek bir işaretçi var ve tahsis edilecek bellek ihtiyacı aslında tek bir işaretçi tarafından işaret olacaktır. Bellek bir dizi bitişik olması gerekir. Bu yüzden, aşağı, yığın büyür diziler için olsa yığın büyür.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • dcigs

    dcigs

    9 EYLÜL 2006
  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • tinycammonitor

    tinycammonit

    14 Aralık 2010