2016-10-07 1 views
3

Ist dieser kleine Code UB?Verwendet die Adresse einer nicht initialisierten Variable UB?

IMO ist es nicht UB, aber ich möchte einige andere Meinungen.

Es druckt einfach die Adresse bar, auch wenn bar wurde nie initialisiert.

+0

Was ist mit 'printf ("% d ", bar);'? Ich erinnere mich an eine Diskussion zwischen unbestimmten und unbestimmten ... –

+4

'printf ("% p ", &bar);' -> 'printf ("% p ", (void *) &bar);'. Dies ist wahrscheinlich nicht zentral für Ihre Frage, sondern C Standard erfordert es. – usr

+1

@EugeneSh. 'printf ("% d ", bar);' ist definitiv UB, es wird alles gedruckt, was im Speicher ist unter der Adresse von 'bar'. –

Antwort

7

TL: DR Nein, Ihr Code ruft nicht UB durch irgendetwas mit uninitialized, wie Sie vielleicht gedacht haben.


Die Adresse eines (ny) variable (automatisch, in diesem Fall) einen definiert Wert, also unabhängig davon, ob die Variable selbst initialisiert wird oder nicht, ist die Adresse der Variablen a definiert Wert. Sie können diesen Wert verwenden. (, wenn Sie nicht mit Zeigern zu tun und Doppel-Dereference tun. :))

Das heißt, genau genommen, sollten Sie

printf("%p", (void *)&bar); 

als %p schreiben erwartet ein Argument vom Typ Zeiger auf void und printf() ist eine variadic Funktion, keine Förderung (Umwandlung) wird durchgeführt. Ansonsten ist dies ein wohldefiniertes Verhalten.

C11, Kapitel §7.21.6.1

p Das Argument ist ein Zeiger auf void sein. [.....]

+0

Aber ist 'void *' nicht kompatibel mit irgendeinem Zeigertyp? –

+0

@MichaelWalz wie? –

+0

@MichaelWalz, jeder Zeiger kann * umgewandelt * werden, um 'void *' zu schreiben, aber keine solche Umwandlung geschieht mit variadischen Argumenten, wie dem zweiten und nachfolgenden Argumenten zu 'printf()'. –

2

Dieses Verhalten ist gut definiert.

Die Adresse der Variablen ist bekannt. Die Tatsache, dass es nicht explizit initialisiert wurde, spielt keine Rolle.

4

Ist dieser kleine Code UB?

Ja, es ist UB, weil die Konvertierungsspezifizierer p eine void -Zeiger erfordert.

Auf der anderen Seite unterhalb der Code ruft nicht

UB
void Test(void) 
{ 
    int bar; 
    printf("%p", (void*) &bar); 
} 

als die Adresse bar auch unabhängig davon, ob bar definiert ist selbst initialisiert wurde.

Verwandte Themen