2011-01-12 10 views
5

Ich habe den Code in meinem System ausprobiert. Das ist, was ich habe ...... 1)Variierender C-Code-Ausgang

#include <stdio.h> 

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

Output: 
1í^áäðPTRhh 

2)

#include <stdio.h> 

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

Output: 
__libc_start_main 

ich in einem anderen System (diff Compiler) versucht. Und die Ausgabe war anders. Eigentlich muss der oberste Wert im Stapel gedruckt werden. Dann ist y nicht überall einzigartig?

+0

ist das Betriebssystem 32bit und 64bit? es kann das Speicherverwaltungsproblem sein – Sudantha

+1

@Sudantha: Was hat das mit Speicherverwaltung zu tun? –

+2

@Sudantha: OS ist 32bit Aber ich bin mir nicht sicher, ob es irgendwelche Auswirkungen hat ???? .. – aTJ

Antwort

7

In Ihrer printf-Anweisung haben Sie einen Formatbezeichner% s angegeben, was bedeutet, dass eine Zeichenfolge gedruckt werden soll. Es wird die Oberseite des Stapels überprüfen und die Zeichenfolge, die auf Stapelkopf

Stapelanordnung Druck wird vollständig Compiler abhängige

Die __libc_start_main() -Funktion jede notwendige Initialisierung der Ausführungsumgebung durchzuführen ist, ruft die Hauptfunktion mit geeigneten Argumenten, und behandeln Sie die Rückkehr von main() und das war auf der Oberseite des Stapels. Und das ist, was Sie als Ausgabe haben

+1

-1: Beantwortet die Frage nicht. Und warum würdest du erwarten, 10 zu sehen? –

+0

@ Oli: Die Antwort wurde geändert .. bitte überprüfen Sie es – Abi

7

Weil Compiler den Inhalt des Stapels frei gestalten können, wie sie wollen. Was auch immer "an der Spitze des Stapels" passiert, wird von printf() als ein Zeiger interpretiert; Es könnte jeden beliebigen Müll am entsprechenden Speicherort geben.

9

Sie haben mit undefined behavior zu tun, so dass Sie nicht erwarten können, dass es konsistent ist, noch irgendeine Art von Muster über Compiler, Architekturen oder sogar läuft das gleiche Programm.