Ein nicht gesetzter C-Zeiger ist nicht null

Ich spiele mit C-Zeigern herum. Wenn ich den folgenden Code kompiliere und ausführe.

Beispiel 1:

#include <stdio.h>

int main()
{
    int k;
    int *ptr;
    k = 555;
    if (ptr == NULL) {
        printf("ptr is NULL\n");
    } else {
        printf("ptr is not NULL\n");
        printf("ptr value is %d\n", *ptr);
    }
    printf("ptr address is %p\n", ptr);
}

Ich bekomme die Ausgabe:

ptr is not NULL
ptr value is 1
ptr address is 0x7fff801ace30

Wenn ich k keinen Wert zugebe:

Beispiel 2:

#include <stdio.h>

int main()
{
    int k;
    int *ptr;
    if (ptr == NULL) {
        printf("ptr is NULL\n");
    } else {
        printf("ptr is not NULL\n");
        printf("ptr value is %d\n", *ptr);
    }
    printf("ptr address is %p\n", ptr);
}

Dann ist die Ausgabe so, wie ich es erwarte:

ptr is NULL
ptr address is (nil)

Ebenso, wenn ich die Variablen außerhalb der Funktion definiere:

Beispiel 3:

#include <stdio.h>

int k;
int *ptr;

int main()
{
    k = 555;
    if (ptr == NULL) {
        printf("ptr is NULL\n");
    } else {
        printf("ptr is not NULL\n");
        printf("ptr value is %d\n", *ptr);
    }
    printf("ptr address is %p\n", ptr);
}

Ausgabe:

ptr is NULL
ptr address is (nil)

Ist das erwartete Verhalten im ersten Beispiel, in dem ptr eine Adresse und einen Wert hat? Wenn ja, dann:

Warum hat ptr eine Adresse und einen Wert?Woher kommen diese, was macht sie aus?Wie definiere ich Nullzeiger im lokalen Bereich richtig und behalte sie so lange bei, bis ich einsatzbereit bin?

Ich kompiliere mit gcc unter Ubuntu 12.04.04 unter x64:

root@dev:~# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

BEARBEITEN

Ich habe meine Beispiele oben zur Verdeutlichung nummeriert.

Basierend auf Dietrichs Antwort habe ich ein bisschen gesucht und diese Frage gefunden:Warum werden globale Variablen immer mit '0' initialisiert, nicht jedoch lokale Variablen?.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage