NULL oder 0?



  • Hab die Frage vorhin schon im WinAPI-Bereich gestellt, und wurde hierher verschoben:
    Was ist denn der Unterschied zwischen NULL und 0?



  • Hallo!

    Nicht das ich das im anderen Forum nicht schon gesagt hätte images/smiles/icon_wink.gif :

    In C:
    #define NULL ((void*)0)

    In C++:
    #define NULL 0

    In stdlib.h:
    /* Define NULL pointer value */

    #ifndef NULL
    #ifdef __cplusplus
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif
    #endif

    Btw, die Benutzung von NULL in C++ ist laut Stroustrup unschön.



  • NULL zeigt an, dasz ein Zeiger nirgends hinweist. Sollte also nur mit Zeigern verwendet werden. 0 (Null) ist Null und bleibt 0; also nur ne Zahl.

    Und so stand's in der MSDN: A value that indicates missing or unknown data in a field. You can use Null values in expressions. Null values can be entered in fields for which information is unknown, as well as in expressions and queries.



  • Hallo,

    Btw, die Benutzung von NULL in C++ ist laut Stroustrup unschön

    Echt? Das hätte ich nicht gedacht. Mir persönlich gefällt NULL im Zusammenhang mit Pointern besser, da ich sofort sehe, was gemeint ist. Ist aber wohl Geschmacksache.

    Gruß



  • Vorweg: ein Null-Zeiger ist ein Zeiger, der "nirgendwohin" zeigt, dh wenn ein Zeiger ein Null-Zeiger ist, ist er ungültig und darf nicht dereferenziert werden. Ein Nullzeiger MUSS sich nicht unbedingt dadurch auszeichnen, daß er auf einer Plattform aus einem Bitmuster, in dem alle Bits gelöscht sind, besteht. Der Compiler sorgt dafür, daß die 0 in die richtige Repräsentation umgesetzt wird.

    Einen Null-Zeiger erhält man, wenn man ihm 0 oder 0L zuweist:
    int *p = 0;

    jetzt ist p ein Null-Zeiger. Wenn man jetzt *p anspricht, ist das Ergebnis undefiniert (ein System könnte schon abstürzen bzw. eine Exception auslösen, sobald ein Adressregister mit einer ungültigen Adresse geladen wird).

    NULL ist ein Makro, dass ebenfalls einen Null-Zeiger zurückliefert. Das kann entweder als 0, als 0L, oder als (void*)0 definiert sein. IMHO sollte man in jedem Fall NULL benutzen, außer es ist wirklich auf den ersten Blick ersichtlich dass die 0 einen Nullzeiger symbolisiert.
    Man könnte, um Code absichtlich unlesbar zu machen, auch NULL in einem Nichtzeigerkontext verwenden, z.B. hatte hier in dem Forum mal einer vorgeschlagen, ein String-Ende etwa so zu suchen:
    while (str[i++] != NULL) //blahblah

    images/smiles/icon_biggrin.gif

    So dass war die C-Sicht der Dinge, ich geh davon aus, dass es in C++ nicht anders ist, falls doch möchte ich gern korrigiert werden images/smiles/icon_smile.gif



  • Ich hatte mal einen Fall, indem nicht mal NULL reichte. Das hatte was mit Zeigern auf Memberfunktionen zu tun, die ja länger als normale Pointer sind. Irgendwie ist da dann nicht richtig implizit erweitert worden. (Vergleich auf NULL ?!? weiß nimmer)
    Mir blieb jedenfalls nichts anderes übrig, als ein neues
    #define MNULL 0LL
    zu definieren. Wenn Ihr da mal merkwürdige Probleme habt, denkt mal dran.


Anmelden zum Antworten