 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Felix Kater Guest
|
Posted: Mon Sep 13, 2004 8:35 am Post subject: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Hallo,
was für ein "Wert" wird l bzw. lp bei folgenden Operationen
eigentlich zugewiesen:
a) long l = NULL;
b) long* lp = NULL;
Ist NULL nur sozusagen ein Hinweis an den Compiler, dass hier ein
nicht-initialisierter Wert vorliegt oder werden hier tatsächlich Zahlen
zugewiesen?
Felix
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Christoph Rabel Guest
|
Posted: Mon Sep 13, 2004 8:47 am Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Felix Kater wrote:
| Quote: |
was für ein "Wert" wird l bzw. lp bei folgenden Operationen
eigentlich zugewiesen:
a) long l = NULL;
b) long* lp = NULL;
Ist NULL nur sozusagen ein Hinweis an den Compiler, dass hier ein
nicht-initialisierter Wert vorliegt oder werden hier tatsächlich Zahlen
zugewiesen?
|
NULL == 0.
Bei korrekter Definition von NULL ist es mit dem Zahlenwert 0 austauschbar.
mfg
Christoph
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Mon Sep 13, 2004 9:18 am Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Felix Kater wrote:
| Quote: | Hallo,
was für ein "Wert" wird l bzw. lp bei folgenden Operationen
eigentlich zugewiesen:
a) long l = NULL;
|
Ist zwar laut Sprachdefinition legal (und äquivalent zu
long l = 0 , aber schlechter Stil - NULL sollte nur für
Zeiger verwendet werden. Manche Compiler warnen übrigens,
wenn das (wie hier) nicht der Fall ist.
| Quote: | b) long* lp = NULL;
Ist NULL nur sozusagen ein Hinweis an den Compiler, dass hier ein
nicht-initialisierter Wert vorliegt oder werden hier tatsächlich Zahlen
zugewiesen?
|
Hier wird 'lp' als sogenannter Nullzeiger initialisiert.
Die Zuweisung ist äquivalent zu "long* lp = 0;". Welche
von beiden Schreibweisen zu bevorzugen ist, darüber streiten
sich die Gelehrten...
Das genaue Bitmuster eines Nullzeigers ist nicht spezifiziert
und compilerabhängig (kann, aber muss nicht aus Nullen bestehen).
Ein nicht initialisierter Zeiger wäre z.B.
long* lp;
Sowohl Nullzeiger als auch nicht initialisierte (oder
anderweitig ungültige) Zeiger dürfen nicht dereferenziert
werden, auf letztere darf strenggenommen nicht mal in
irgendeiner Weise lesend zugegriffen werden.
Der Vorteil, einem Zeiger, der nicht auf ein existierendes
Objekt zeigt, den Nullzeiger zuzuweisen, ist, dass man
ihn danach darauf testen kann (z.B. "if(lp != NULL) *lp = 42;"),
während es im Allgemeinen keine Möglichkeit gibt, einen Zeiger
auf Ungültigkeit zu testen.
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Mon Sep 13, 2004 9:29 am Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Felix Kater <f.kater2 (AT) gmx (DOT) net> wrote:
| Quote: | Hallo,
was für ein "Wert" wird l bzw. lp bei folgenden Operationen
eigentlich zugewiesen:
a) long l = NULL;
b) long* lp = NULL;
Ist NULL nur sozusagen ein Hinweis an den Compiler, dass hier ein
nicht-initialisierter Wert vorliegt oder werden hier tatsächlich Zahlen
zugewiesen?
|
Ersteres waere wohl ueberfluessig, den der Compiler weiss schliesslich
selbst, ob er ein Objekt initialisiert hat oder nicht ;-)
Die Wirkung ist dieselbe wie bei
long l = 0;
long* lp = 0;
NULL ist nichts weiter als ein Makro, das in C++ eine ganzzahlige
Konstante mit dem Wert 0 darstellt. Wenn einem Zeiger 0 oder NULL
zugewiesen wird, wird dieser zu einem sog. Nullzeiger (null pointer).
Wie das Bitmuster eines solchen Nullzeigers aussieht, haengt von der
Implementierung ab. Auf den gaengigen Systemen besteht es aus 0-Bits,
muss aber nicht.
Ob NULL in C++ ueberhaupt verwendet werden soll, ist unter
Programmierern strittig. Einig ist man sich allerdings darueber, dass
es *nicht* zur Zuweisung (oder Initialisierung) von 0 an ganzzahlige
Variablen verwendet werden soll. NULL ist aus Sicht der
Sprachdefinition eigentlich nur zur Verwendung mit Zeigern bestimmt.
Manche Compiler warnen sogar bei long l=NULL
--
Horst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marcel Müller Guest
|
Posted: Mon Sep 13, 2004 9:37 am Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Christoph Rabel wrote:
| Quote: | NULL == 0.
Bei korrekter Definition von NULL ist es mit dem Zahlenwert 0 austauschbar.
|
Wobei ist die nicht standardkonforme Interpretation von Borland (oder
war es inmos?) recht gut fand, wo NULL mit ((void*)0) definiert war und
der Compiler natürlich implizite Casts von diesem Ausdruck auf beliebige
Pointer akzeptiert hat.
Vorteil:
long l = NULL;
liefert einen Fehler.
und
void foo (int i);
void foo (int* i);
foo(NULL);
ist nicht mehrdeutig.
In allgemeineren Fällen, z.B.:
void foo (int* i);
void foo (my_class* i);
hilft das natürlich nicht, da NULL eben eigentlich typspezifisch sein
müßte. Also eigentlich datatype::NULL...
Dabei kommt mir die Idee ein typisiertes NULL zu verwenden:
template <typename T>
struct null
{ operator T* { return NULL; }
};
oder als Funktion
template <typename T>
T* null()
{ return NULL; }
sollte doch eigentlich gehen, oder?
Marcel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Sep 13, 2004 11:47 am Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Marcel Müller wrote:
| Quote: |
Dabei kommt mir die Idee ein typisiertes NULL zu verwenden:
template
struct null
{ operator T* { return NULL; }
};
oder als Funktion
template
T* null()
{ return NULL; }
sollte doch eigentlich gehen, oder?
|
Siehe
http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1488.pdf
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Mon Sep 13, 2004 11:56 am Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Marcel Müller wrote:
| Quote: | Dabei kommt mir die Idee ein typisiertes NULL zu verwenden:
template <typename T
struct null
{ operator T* { return NULL; }
};
|
Da müsste man wohl
long* lp = null
MeineGeileKlasse* pMGK = null<MeineGeileKlasse>();
schreiben, da es keine automatische Templateargumentdeduktion
für Klassentemplates gibt.
| Quote: |
oder als Funktion
template <typename T
T* null()
{ return NULL; }
|
Ähnlich:
long* lp = null
da das kein Funktionsargument gibt, aus dem der Typ für die
Templateinstanzierung hergeleitet werden kann.
Hübscher ist die Variante mit dem Membertemplate, welche im
folgenden Proposal für eine neue Revision der Norm
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf>
diskutiert wird (Danke an James Kanze, der diesen Link hier vor
ein paar Tagen schon einmal gepostet hat!):
const // this is a const object...
class {
public:
template<class T> // convertible to any type
operator T*() const // of null non-member
{ return 0; } // pointer...
template<class C, class T> // or any type of null
operator T C::*() const // member pointer...
{ return 0; }
private:
void operator&() const; // whose address can’t be taken
} nullptr = {}; // and whose name is nullptr
Im zitierten Papier werden auch Vor- und Nachteile dieser Lösung
besprochen, und die Autoren kommen zum Schluss, dass eine in den
Compiler integrierte Lösung mit einem neuen Schlüsselwort 'nullptr'
vorteilhafter wäre, um die Mehrdeutigkeitsprobleme mit 0 und
NULL zu umgehen.
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Felix Kater Guest
|
Posted: Mon Sep 13, 2004 8:36 pm Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Falk Tannhäuser:
| Quote: | b) long* lp = NULL;
Hier wird 'lp' als sogenannter Nullzeiger initialisiert.
Die Zuweisung ist äquivalent zu "long* lp = 0;". Welche
von beiden Schreibweisen zu bevorzugen ist, darüber streiten
sich die Gelehrten...
|
Dann würde ich eigentlich auf NULL zugunsten von 0 verzichten. Denn mir
fällt kein Gegenargument ein. Oder was könnte man da noch anführen?
Felix
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Hendrik Belitz Guest
|
Posted: Tue Sep 14, 2004 7:44 am Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Felix Kater wrote:
| Quote: | Falk Tannhäuser:
b) long* lp = NULL;
Hier wird 'lp' als sogenannter Nullzeiger initialisiert.
Die Zuweisung ist äquivalent zu "long* lp = 0;". Welche
von beiden Schreibweisen zu bevorzugen ist, darüber streiten
sich die Gelehrten...
Dann würde ich eigentlich auf NULL zugunsten von 0 verzichten. Denn mir
fällt kein Gegenargument ein. Oder was könnte man da noch anführen?
|
Ein Gegenargument wäre die bessere Lesbarkeit. So fällt es bei der
Verwendung von NULL einfach beim Programmieren leichter, den Überblick zu
behalten (Zumindest mir). Aber ich bin ja auch kein Gelehrter, sondern nur
Akademiker... ;-)
--
To get my real email adress, remove the two onkas
--
Hendrik Belitz
- Abort, Retry, Fthagn? -
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andre Poenitz Guest
|
Posted: Mon Sep 20, 2004 7:22 pm Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Marcel Müller <news.5.maazl (AT) spamgourmet (DOT) org> wrote:
| Quote: | Christoph Rabel wrote:
NULL == 0.
Bei korrekter Definition von NULL ist es mit dem Zahlenwert 0 austauschbar.
Wobei ist die nicht standardkonforme Interpretation von Borland (oder
war es inmos?) recht gut fand, wo NULL mit ((void*)0) definiert war und
der Compiler natürlich implizite Casts von diesem Ausdruck auf beliebige
Pointer akzeptiert hat.
Vorteil:
long l = NULL;
liefert einen Fehler.
|
Das schafft der gcc auch ohne falsches #define, indem er einfach 'NULL'
'selbst' extra behandelt, ansonsten aber brav '0' weitergibt.
| Quote: | void foo (int i);
void foo (int* i);
foo(NULL);
ist nicht mehrdeutig.
|
Sondern bei
foo(NULL)
wird die falsche (d.h. die zweite) Funtion aufgerufen? Na toll.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andre Poenitz Guest
|
Posted: Mon Sep 20, 2004 7:23 pm Post subject: Re: Was passiert eigentlich bei Zuweisung von NULL? |
|
|
Christoph Rabel <odie (AT) hal9000 (DOT) vc-graz.ac.at> wrote:
| Quote: | was für ein "Wert" wird l bzw. lp bei folgenden Operationen
eigentlich zugewiesen:
a) long l = NULL;
b) long* lp = NULL;
Ist NULL nur sozusagen ein Hinweis an den Compiler, dass hier ein
nicht-initialisierter Wert vorliegt oder werden hier tatsächlich Zahlen
zugewiesen?
NULL == 0.
Bei korrekter Definition von NULL ist es mit dem Zahlenwert 0 austauschbar.
|
Das ist richtig. Es heisst im Fall b) allerdings nicht, dass da
irgendetwas entsteht, was nur 0-bits hat bzw. auch nur annaehernd die
selbe Struktur wie ein 'long(0)' hat.
Nur der Vollstaendigkeit halber.
Andre'
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|