NULL gleich dem boolschen Wert false bzw. 0?



  • Da habe ich eine schöne FAQ.



  • supertux schrieb:

    Vertexwahn schrieb:

    supertux schrieb:

    doch, wenn ptr != NULL, dann ist ptr irgendetwas ungleich 0

    FALSCH! nicht nach C99

    doch.

    Naja nicht ganz, die Nullpointerkonstante die sich hinter NULL verbirgt wird in einen Nullpointer vom Typ den ptr hat umgewandelt. Und die beiden sind jetzt ungleich wenn sie nicht denselben Wert haben, sprich nicht auf die selbe Speicherstelle zeigen1.

    1das ist nur eine von 3 Möglichkeiten, zu dem Rest am besten den Standard konsultieren, es ist etwas kompliziert zu erklären



  • mmh...

    von: http://www-info2.informatik.uni-wuerzburg.de/dclc-faq/kap1.html:
    "Antwort: Laut Sprachdefinition wird ein integraler konstanter Ausdruck mit dem Wert 0 zu einem Null-Zeiger, wenn er einem Zeiger zugewiesen oder auf Gleichheit mit einem Zeiger verglichen wird (Äquivalenzvergleich)."

    wenn, mir jetzt noch jemand sagen könnnte wo ich entsprechendes im ISO/IEC
    9899:1999 nachlesen kann, dann bin ich glücklich 😉

    find da irgendwie nichts



  • Vertexwahn schrieb:

    wenn, mir jetzt noch jemand sagen könnnte wo ich entsprechendes im ISO/IEC 9899:1999 nachlesen kann

    6.3.2.3#3



  • Damit ich es jetzt nicht falsch verstehe:

    C99 schrieb:

    An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

    sagt diese Textstelle aus das jetzt ein NULL-Pointer auch als Integer Wert 0 interpretiert werden kann - eigentlich nicht - kann ich da jetzt einfach eine Äquivalenzrelation hineininterpretieren und sagen wenn eine 0 = NULL, dann auch NULL = 0



  • Vertexwahn schrieb:

    sagt diese Textstelle aus das jetzt ein NULL-Pointer auch als Integer Wert 0 interpretiert werden kann - eigentlich nicht

    Was meinst du mit "interpretieren"? Ein Nullzeiger muss auf Bitebene nicht aus lauter Nullen bestehen, genauso kann der Wert eines Nullzeigers auch 0x12345678 oder was auch immer sein. Der Standard stellt daher sicher, dass bei

    void* a = 0;
    

    a ein Nullzeiger ist.
    Genauso wird bei

    if (a != 0)
    

    a auf einen Nullzeiger geprüft, und nicht ob jedes Bit 0 ist.



  • naja so wie ichs jetzt verstehe, ist NULL nicht unbedingt 0x0. ABER, es ist sicher gestellt das trotzdem (0==NULL) true ist.
    also: NULL==0==false 🤡



  • falls ich jetzt folgende Code hab:

    if (a)
    

    wie wertet das der Compiler aus? a ist doch ein Zeiger - ich nehm mal an das der Zeiger in einen boolschen Wert konvertiert werden muss wie geht das?



  • Vertexwahn schrieb:

    falls ich jetzt folgende Code hab:

    if (a)
    

    wie wertet das der Compiler aus? a ist doch ein Zeiger - ich nehm mal an das der Zeiger in einen boolschen Wert konvertiert werden muss wie geht das?

    wenn a auf den NULLzeiger zeigt (also a==NULL), dann ist die Bedingung nicht erfüllt und der Inhalt der if Schleife wird nicht ausgeführt.

    Wenn a auf keinen NULLzeiger zeigt, dann ist die Bedingung wahr, weil a ungleich 0 ist, also wird der Inhalt der if Schleife wird ausgeführt.



  • wenn der Nullzeigers den Wert 0x12345678, dann entspricht das doch nie dem wert 0 - da muss ja impliziet irgendwie gecastet werden



  • Vertexwahn schrieb:

    wenn der Nullzeigers den Wert 0x12345678, dann entspricht das doch nie dem wert 0 - da muss ja impliziet irgendwie gecastet werden

    Du willst 'if(p)' analysiren:

    'if ('
    Okay, -> 6.8.4.1#2
    |In both forms, the first substatement is executed if the expression compares unequal to 0.
    |In the else form, the second substatement is executed if the expression compares equal
    |to 0. If the first substatement is reached via a label, the second substatement is not
    |executed.

    Aha, 'compares unequal to 0', also ist if(expr) das gleiche wie if((expr) != 0). -> 6.5.9 (Equality operators), insb. 6.5.9#5
    |Otherwise, at least one operand is a pointer. If one operand is a pointer and the other is a
    |null pointer constant, the null pointer constant is converted to the type of the pointer. If
    |one operand is a pointer to an object or incomplete type and the other is a pointer to a
    |qualified or unqualified version of void, the former is converted to the type of the latter.

    Den Rest hatten wir schon. Wieso kramst Du immer wieder die Binärdarstellung des Zeigers intern raus? Wen interessiert die?



  • Vertexwahn
    **********

    if(ptr)
    {
    free(ptr);
    }

    Was mich mal interessiern würde WO du diese Codebeispiele ausgegraben hast. Mich würde ernsthaft das gesamte Programm dazu interessieren.

    tt



  • groovemaster schrieb:

    [Doch, das ist absolut legaler Code. Man könnte eher sagen, dass es ungeschickt ist. Denn ein

    free(ptr);
    

    reicht vollkomen aus.

    Kann man auch verschärft sehen: Mit der if- Abfrage wird ja nicht sichergestellt, daß es genau der Pointer ist, den man killen mag, sondern nur sichergestellt, daß irgendwas drinsteht, was if() nicht als false (!=0) sieht. Überlegt mal, wie groß die Chance ist, daß if() wirklich false rauskriegt ... :p

    So eine Abfrage ist also nichts als schwachsinniges 🤡 Verbraten von Rechenzeit!



  • pointercrash() schrieb:

    Überlegt mal, wie groß die Chance ist, daß if() wirklich false rauskriegt ... :p

    Beim MSC als Debug Build ziemlich klein, ich sag nur 0xcccccccc. 😃



  • Aha, 'compares unequal to 0', also ist if(expr) das gleiche wie if((expr)

    TheTester schrieb:

    Was mich mal interessiern würde WO du diese Codebeispiele ausgegraben hast. Mich würde ernsthaft das gesamte Programm dazu interessieren.

    Das Codebeispiel habe ich mir selbst ausgedacht - bevor man mit Zeigern arbeitet sollte man doch überprüfen ob sie ungleich NULL sind - macht durchaus Sinn - wußte nicht das free intern selbst überprüft, ob der Zeiger ungleich NULL ist - damit ist das Beispiel natürlich völliger Unsinn

    kann man für Bibiliotheksfunktionen allgemein die Aussage treffen das, dass diese ihren Input wenn möglich auf "Fehler" überprüfen und ich nur gucken muss ob was schiefgelaufen ist, wenn ich "output" bekomme?

    Daniel E. schrieb:

    das gleiche wie if((expr) != 0).

    wenn ich so einen Ausdruck sehe, dann weiß ich echt nicht was der Compiler damit macht -
    if(p != 0)
    der Wert 0 ist doch erst mal ein Integer Wert - p ist z. B. ein Zeiger auf einen int

    wie wird das jetzt Aufgelöst - man kann doch schlecht einen Integer Wert mit einem int Zeiger vergleichen?

    wird da jetzt meine 0 in einen Null Pointer umgewandelt? und dann der Null Pointer mit p verglichen?



  • Was an

    6.5.9#5
    |Otherwise, at least one operand is a pointer. If one operand is a pointer and the other is a
    |null pointer constant, the null pointer constant is converted to the type of the pointer.

    ist dir unklar?



  • mir war unklar, dass der int Wert 0 als "null pointer constant" betrachtet wird

    C99 schrieb:

    An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

    manchmal sieht man den Wald vor lauter Bäumen nicht - danke für euere geduld 🙂



  • Vertexwahn schrieb:

    mir war unklar, dass der int Wert 0 als "null pointer constant" betrachtet wird

    genau das haben wir auch gesagt.


Anmelden zum Antworten