NULL gleich dem boolschen Wert false bzw. 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 beiif (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 intwie 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.