2011-01-12 26 views
5

Kodu sistemimde denedim. BuDeğişiklik C kodu çıkışı

#include <stdio.h> 

    int main() 
    { 
     int a = 10; 
     printf("%s\n"); 
     return 0; 
    } 

Output: 
__libc_start_main 

ben başka bir sisteme (fark derleyici) yargılanması 1)

#include <stdio.h> 

    int main() 
    { 
     //int a = 10; 
     printf("%s"); 
     return 0; 
    } 

Output: 
1í^áäðPTRhh 

2) ...... ne var olduğunu. Ve çıktı farklıydı. Aslında, yığındaki en üstteki değeri yazdırmalıdır. O zaman y her yerde eşsiz değil mi?

+0

İşletim Sistemi 32bit ve 64bit nedir? Bu bellek yönetimi sorunu olabilir – Sudantha

+1

@Sudantha: Bu bellek yönetimi ile ne ilgisi var? –

+2

@Sudantha: OS 32bit Ancak, herhangi bir etkisi olup olmadığından emin değilim ???? .. – aTJ

cevap

7

printf ifadenizde, bir dize yazdırmak için% s biçim belirteci belirttiniz. Bu yığının üst kontrol

yığın düzenlemesi

__libc_start_main() işlevi, işletme ortamı gerekli başlatma gerçekleştirmek zorundadır tamamen Derleyici bağlıdır yığının üst kısmında bulunan dizi baskı, ana işlevini çağırır uygun argümanlar ile ve main() 'dan geri dönüşü işlemek ve yığınının üstünde.

+1

-1: Bu soruya cevap vermiyor. Ve neden 10'u görmeyi beklersiniz? –

+0

@ Oli: Cevabı değiştirildi .. lütfen kontrol et – Abi

7

Derleyiciler, istifin içeriğini istedikleri gibi düzenlemekte serbesttirler. Ayrıca, "yığının en üstünde" ne olursa olsun, bir işaretçi olarak printf() tarafından yorumlanacaktır; İlgili depolama yerinde rastgele bir önemsiz olabilir.

9

Çıktısı olarak aldığınız şey budur. undefined behavior ile uğraşıyorsunuz, bu yüzden tutarlı olmasını bekleyemezsiniz, aynı zamanda derleyicilerin, mimarilerin veya hatta aynı programın çalışmalarının herhangi bir modelini takip edebilirsiniz.