2017-06-20 3 views
0
#include <stdio.h> 

    int main(void) 
    { 

     int i=10; 
     printf("%p",i); 
     return 0; 
    } 

Ausgang: -Im verwirrt bezüglich% p Spezifizierer

0xa 

% p - Ich habe p gelesen% verwendet Zeiger in printf zu drucken, aber hier ist i eine ganze Zahl, und auch gibt es keine Zeiger deklariert so, wie "0xa" ausgegeben wird.

+0

Falscher Eingang, falscher Ausgang. Im Allgemeinen druckt 'printf' nur, was immer du hineinlegst. Hier setzen Sie eine ganze Zahl und diese ganze Zahl wird gedruckt. Da '% p' nicht der richtige Formatbezeichner für Integer ist, hast du auch undefiniertes Verhalten – Gerhardh

+0

Übrigens, nichts ist falsch an der Frage IMHO. Schön geschrieben und ein kompilierbares Beispiel. – Bathsheba

Antwort

4

Das Verhalten des Codes ist undefined seit einem %p Spezifizierer für einen int Typ kein geeignetes Format ist.

Der Compiler ist berechtigt, alles, was die Optimierung Ihres Codes zu int main(){} enthält.

2

Technisch ist es undefiniertes Verhalten, weil %p der falsche Formatbezeichner für einen int ist.

Aber wenn Ihre Plattform 32 Bits ist, dann %p kocht in der Regel auf den meisten Implementierungen Drucken des gelieferten Wert in Hexadezimal nach unten und wird daher in der Regel printf("%p", 10);0xA oder 0x0000000A auf diesen Implementierungen drucken.

Wie auch immer, verwenden Sie keine unübertroffenen Formatbezeichner, denn selbst wenn es zu funktionieren scheint, ergibt es undefined behaviour.

+0

Rationalizing UB ist eine gefährliche Kunst. IMHO muss hier mehr Sorgfalt aufgewendet werden. Z.B. "int" könnte 16 Bit auf einer 32-Bit-Plattform sein. Was dann? Aber Sie beschreiben die Ausgabe plausibel, also ist Ihre Antwort vielleicht hilfreicher als meine. Habe eine Verbesserung. – Bathsheba

+0

@Bathsheba yes 'int' könnte 16 Bit lang sein, obwohl mir eine solche Implementierung nicht bekannt ist. Aber irgendwie schrieb ich _usually_. –

+0

Unser alter Freund Turbo C++ hat 16 Bit Ints, und viele Schulen scheinen es zu benutzen. – Bathsheba