2011-06-29 21 views
5
#include<stdio.h> 
int main() 
{ 
    int i, j; 
    int *pi,*pj; 
    pi=&i; 
    pj=&j; 

    printf("pi-pj=%d\n",pi-pj); 
    return 0; 
} 

Bu kodu farklı derleyiciler üzerinde denedim, ancak her seferinde aynı sonucu alıyorum, neden aynı olduğunu anlamanıza yardımcı olan herhangi biri olabilir mi?Bu C kodunun çıkışı

Çıkışı: Bellek normalde bitişik olarak tahsis edilmesi gibi

pi -pj = 3 

Ben karıştı. Yani, diyelim, sistem yığınımız aşağı doğru büyüyor ve biz &i = 0xA, daha sonra j(&j) = 0x6 adresleri var (tamsayılar 4 bayttır). Şimdi bu iki int işaretçi değeri arasındaki farkı yazdırırken, çıktı "1" olmalıdır. Ama "3" olarak geliyor. Neden?

+1

Yığın Taşmasına Hoş Geldiniz! Ne çıktı alıyorsunuz? Ne bekliyordun? Bu sorunun ne hakkında daha hassassanız, daha iyi geri bildirim verebiliriz. Ayrıca, bu bir ev ödevi sorusu mu? Eğer öyleyse, böyle etiketlemelisiniz. – templatetypedef

+1

Farklı derleyicilerden aynı sonucu almak bir problemdir. Lanet olsun! Tüm programlarım düzgün çalışmıyor. – tjm

+0

Üzgünüz, neden olduğu uyumsuzluk için, sorgumu düzenledim, sorun açıklamasını tartıştığınız için teşekkürler. – Learner

cevap

5

Deneyimlerinizi çoğaltamıyordum. Linux x86 üzerinde gcc olarak:

[[email protected] ~]$ cat t.c 
#include<stdio.h> 
int main() 
{ 
    int i, j; 
    int *pi,*pj; 
    pi=&i; 
    pj=&j; 

    printf("pi-pj=%d\n",pi-pj); 
    return 0; 
} 

[[email protected] ~]$ gcc -o t t.c 
[[email protected] ~]$ ./t 
pi-pj=1 
[[email protected] ~]$ 

Bu i ve j bitişik olduğu anlamına gelir. İşaretçi çıkarma, adres farkı değil, işaretçiler arasındaki öğe sayısını döndürür. Sonucunuzu elde etmek için, aralarında iki ürün değerinde dolgu olması gerekirdi. Bunun nasıl olabileceğini açıklayamam.

+1

MSVC döndürür 3: iki öğe-değerinde dolgu pi ve pj vardır. Optimizasyon ile -1 elde ederim, yani i ve j diğer şekilde düzenlenmiştir. – Rup

+0

Microsoft Visual Studio 2010'daki derlemeyi denedim ... n çıktı 3 olarak geliyordu, ** @ Rup **, bana, derleyici optimizasyonunun çıktıyı nasıl değiştirdiğini bana bildirin. – Learner

+0

Sanırım onun p1 ve p2'yi saklaması gerekmediği - sadece onları hesaplar ve bunları hiç bir zaman belleğe göndermeden çıkarır - ve böylece yığınlar için herhangi bir yer ayırmaz. – Rup

İlgili konular