C - if(pointer)

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 522
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

C - if(pointer)

Beitrag von starcow »

Ich frage mich grad, ob es in reinem C wirklich zulässig ist, einen potentiellen Null-Pointer mit folgender Anweisung zu entsprechen:

Code: Alles auswählen

if(pointer)
{
	... // Es ist KEIN NULL-Pointer
}
else
{
	... // Es IST ein NULL-Pointer
}
In C++ müsste dies ja wirklich ausnahmslos funktionieren, da dort NULL nichts anderes ist, als das Makro:

Code: Alles auswählen

 #define NULL 0L
Jedenfalls laut der Quelle, die ich hier zuhand habe.
Aber funktioniert das auch wirklich zu 100% in C zuverlässig? Denn in C kann NULL ja anscheinend auf dreierlei Arten definiert sein:

Code: Alles auswählen

#define NULL 0
#define NULL 0L
#define NULL (void*) 0
Beim letzten der drei Fälle bin ich mir nicht mehr absolut sicher, ob das if statement vielleicht doch darauf anspringt, da das entsprechende Bitmuster nach dem cast zu void* nicht mehr an allen Stellen 0 ist.

Und die zweite Frage in diesem Kontext:
Habe ich das richtig verstanden, dass wenn ich einer Funktion einen NULL-Pointer übergeben will, ich zuerst NULL in den richtigen Pointer-Typ casten muss (die Frage bezieht sich auch hier in erster Linie auf reines C)?

Code: Alles auswählen

void func(int* pointer); // Funktion nimmt einen int-Pointer entgegen, der auch NULL sein darf

func((int*)NULL); // Cast von NULL in den von "func" erwarteten Pointer-Typ
Gruss, starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Schrompf
Moderator
Beiträge: 4831
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: C - if(pointer)

Beitrag von Schrompf »

Beim Cast einer Zahl zu einem Zeiger gibt's ne explizite Ausnahme für den Wert 0. Alle anderen Werte sind unzulässig und geben nen Compilerfehler. Aber 0 geht. Daher musst Du in Deinem letzten Beispiel auch nicht casten, wenn Du einer Funktion NULL übergeben willst
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8227
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: C - if(pointer)

Beitrag von Krishty »

Ja; für den Cast Zeiger-zu-int (C) bzw. Zeiger-zu-bool (C++) gibt es AFAIK auch eine Sonderregel, die das if legalisiert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
starcow
Establishment
Beiträge: 522
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: C - if(pointer)

Beitrag von starcow »

Schrompf hat geschrieben: 18.09.2022, 22:25 Beim Cast einer Zahl zu einem Zeiger gibt's ne explizite Ausnahme für den Wert 0. Alle anderen Werte sind unzulässig und geben nen Compilerfehler. Aber 0 geht. Daher musst Du in Deinem letzten Beispiel auch nicht casten, wenn Du einer Funktion NULL übergeben willst
Ok, Danke - gut zu wissen!
Krishty hat geschrieben: 18.09.2022, 22:34 Ja; für den Cast Zeiger-zu-int (C) bzw. Zeiger-zu-bool (C++) gibt es AFAIK auch eine Sonderregel, die das if legalisiert.
Achso, der Compiler führt bei if(pointer) zuerst einen impliziten cast durch. Das macht natürlich Sinn!

Wie haltet ihr es denn mit der Syntax. Welche Variante verwendet ihr in eurem Code? if(pointer) oder if(pointer == NULL)? :-)

LG, starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Krishty
Establishment
Beiträge: 8227
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: C - if(pointer)

Beitrag von Krishty »

Auf der Arbeit erzwingen wir if(pointer) weil’s kompatibel mit Smart Pointern ist; siehe Cpp Core Guidelines. Privat if(nullptr != pointer), wobei ich vielleicht irgendwann davon weggehe.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten