zeiger mit NULL: Ja oder Nein?



  • im sauberem c**++** nutzt man autopointer, damit es keine uninitialisierten pointer gibt (wenn auch nur auf NULL)



  • Man sollte alle Variablen initialisieren. Und da Pointer auch Variablen sind, gilt das auch für sie. Und NULL ist nunmal auch ein Wert. Er hat natürlich eine semantische Bedeutung, was das ganze sogar einfacher und somit sinnvoll macht.



  • Ich habe irgendwo mal gelesen, dass es sauberer ist, einfach 0 anstatt NULL zu verwenden.

    Struppi schrieb:

    Should I use NULL or 0?

    In C++, the definition of NULL is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0. Another problem with NULL is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. In pre-standard code, NULL was/is sometimes defined to something unsuitable and therefore had/has to be avoided. That's less common these days.

    Felix

    EDIT: Wenn naemlich NULL wie folgt definiert ist:

    #define NULL (void*)(0)
    

    Dann kann man in C++ durch die strengere Typpruefung Aerger kriegen, weil man dann explizit nochmal von void* auf einen anderen Zeigertyp casten muesste.

    Beispiel:

    #define NULL (void*)(0);
    
    int main(void)
    {
       char *myPointer = NULL;
        return 0;
    }
    

    ➡ error: a value of type "void *" cannot be used to initialize an entity of type "char *"



  • Phoemuex schrieb:

    EDIT: Wenn naemlich NULL wie folgt definiert ist:

    #define NULL (void*)(0)
    

    Dann kann man in C++ durch die strengere Typpruefung Aerger kriegen, weil man dann explizit nochmal von void* auf einen anderen Zeigertyp casten muesste.

    Ein Compiler, der sowas macht, ist aber nicht mehr standardkonform - denn laut Standard muß die Zuweisung 'char* p = NULL;' erlaubt sein.



  • Soweit ich gesehen hab ist NULL (in der MSVC++ 2003-Implementation) sowieso so implementiert: #define NULL 0. Deshalb erübrigt sich der Typ.
    NULL statt 0 bei Zeigern zu benutzen macht schon Sinn (für den Programmierer), weil "NULL" eben für "Ungültigkeit" steht, "0" dagegen ist ein völlig normaler Wert.



  • Badestrand schrieb:

    Soweit ich gesehen hab ist NULL (in der MSVC++ 2003-Implementation) sowieso so implementiert: #define NULL 0. Deshalb erübrigt sich der Typ.
    NULL statt 0 bei Zeigern zu benutzen macht schon Sinn (für den Programmierer), weil "NULL" eben für "Ungültigkeit" steht, "0" dagegen ist ein völlig normaler Wert.

    Nein, das ist so leider nicht korrekt. Zwischen NULL und 0 existiert kein unterschied. Du hast doch selber die Definition gepostet. Macht technisch und semantisch keinen Unterschied, sieht nur im Texteditor anders aus... ums mal naiv zu formulieren.

    Das was du meinst, nämlich ein sprachliches und semantisches Null (im Sinne von "leer" oder "nicht vorhanden") gibt es in C++-Pointern nicht. Noch nicht! Wird sich hoffentlich mit C++0x ändern.



  • Badestrand schrieb:

    ...
    weil "NULL" eben für "Ungültigkeit" steht, "0" dagegen ist ein völlig normaler Wert.

    Na, ich weiß nicht ... das hier geht doch auch:

    int i = 3;
       i += 5 + NULL;
    
      // oder richtig schön:
      int p = NULL;
    

    😃

    Gruß,

    Simon2.



  • Menno, das meinte ich doch auch: Eben dass NULL im Auge des Programmierers nach "Ungültigkeit" aussieht, faktisch aber dasselbe ist wie 0 🙂



  • ich persoenlich bevorzuge 0, da ich es als unnoetig erachte defines zu benutz die man auch problemlos weg lassen kann



  • Ja, hab ich auch mal ne Zeitlang gemacht. War nur doof, wenn man mal nach einer null-Initialisierung für Pointer suchen lassen wollte. Wird schwierig mit der Suchfunktion. 😃 NULL kann man halt besser suchen... kommt zwar selten vor, aber immerhin.

    Aber am saubersten wäre es natürlich, wenn es ein Schlüsselwort geben würde. Wir dürfen auf C++0x gespannt sein, da werden wir wohl endlich ein nullptr-Schlüsselwort erhalten. 🙂



  • NULL sollte man nicht verwenden weil es nicht richtig funktioniert. Die Idee Zahlen 0 und Zeiger 0 zu unterscheiden ist natürlich gut aber das Problem ist dass NULL nun einmal eine Zahlen 0 und keine Zeiger 0 ist.

    void foo(int); // 1
    void foo(void*); // 2
    
    void bar(){
      foo(0); // 3
      foo(NULL); // 4
    }
    

    Von (3) erwartet man, dass (1) aufgerufen wird, was auch passiert. 4 sollte aber 2 aufrufen tut es aber nicht da NULL ja 0 ist wird auch 1 aufgerufen.

    Solche Overloads sind natürlich auch keine gute Idee. Bei Templates gibt es aber ähnliche Probleme.

    typedef int* Ptr
    Ptr array[10];
    std::fill(array, array+10, NULL);
    


  • und was schlägst du dann vor?


Anmelden zum Antworten