NULL



  • genauer gesagt schrieb:

    ist NULL das Selbe wie 0

    IMHO darf ein "implementation-defined null pointer" (7.17) auch z.B. ((void*)0) sein.



  • LordJaxom schrieb:

    genauer gesagt schrieb:

    ist NULL das Selbe wie 0

    IMHO darf ein "implementation-defined null pointer" (7.17) auch z.B. ((void*)0) sein.

    Noch genauer wäre nicht darf, sondern MUSS (void*)0 sein, damit die Typenrichtigkeit erhalten bleibt. Bei

    if (0 == NULL)
    

    sollte der Compiler meckern. 😉



  • pointercrash() schrieb:

    Bei

    if (0 == NULL)
    

    sollte der Compiler meckern.

    ja, aber nicht das was du erwartest, sondern er meckert: 'condition always true', was soviel heisst wie: 'diese if-abfrage sieht zwar schick aus, ist aber bestenfalls als ersatz für #if 0 ... #endif oder /* ... */ zu gebrauchen'.
    0 und NULL sind, aus sicht der programmlogik, das selbe.
    🙂



  • zero-freak schrieb:

    ja, aber nicht das was du erwartest, sondern er meckert: 'condition always true', 0 und NULL sind, aus sicht der programmlogik, das selbe.

    Ja, nö, war mir schon klar, war auch eher transfermäßig gemeint, aber Du hast mich stutzig gemacht. Keine Chance zum Wegoptimieren hat der Compiler bei sowas:

    volatile int nullinger = 73;
    // -------------------------
    int foo(void)
    {
    	while (nullinger)
    	{
    	if (nullinger != NULL)
    		nullinger++;
    	}
    	return nullinger;
    }
    

    und da wird wirklich echter Code erzeugt, es wird auch nicht gemotzt und er kommt auch mit 'ner int 0 aus der Funktion.
    Meine blöde Frage, wieso es ihn nicht kratzt, ungleiche Typen zu vergleichen, nichtmal eine Warning, hab' schon zwei Compiler damit gefüttert. 😕



  • (void*)0 und 0 sind das selbe. steht irgendwo im C-standard.
    🙂



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



  • Shade Of Mine schrieb:

    In C++:
    #define NULL 0

    ehrlich? ich hätte wetten können, dass die C++ variante so aussieht:

    const int NULL = 0
    

    🙂



  • nein, da man sonst kein #ifdef NULL machen kann...



  • void*-freak schrieb:

    (void*)0 und 0 sind das selbe. steht irgendwo im C-standard. 🙂

    Warum frißt der Compiler das nicht

    while (nullinger != malloc(sizeof(nullinger)))
     nullinger++;
    

    aber mit 'nem Typecast schon:

    while (nullinger != (int) malloc(sizeof(nullinger)))
     nullinger++;
    

    Ja, ich weiß, Nonsens- Code. Aber wann sind int 0 und (void*)0 wirklich gleich 😕



  • pointercrash() schrieb:

    Aber wann sind int 0 und (void*)0 wirklich gleich 😕

    als konstanten sind sie's. du kannst überall wo (void*)0 erscheint, eine 0 hinschreiben. eine 'int' variable ist natürlich nicht dasselbe wie eine 'void*' variable, aber du kannst z.b. schreiben:

    int *a = (void*)0; // geht weil void* kompatibel mit allen pointern ist
    int *b = 0;        // geht, 0 ist hier wie (void*)0
    int *c = 1;        // geht nicht, weder 0 noch type-cast zu void* oder int*
    int d = (void*)0;  // geht nicht, inkompatibler typ (int ist kein pointer)
    

    🙂


Anmelden zum Antworten