Autor: Markus Demleitner (msdemlei_at_cl.uni-heidelberg.de)
Datum: 16. Aug 2002
On Fri, Aug 16, 2002 at 12:17:05PM +0200, Alexander Holler wrote:
> >6.3.2.3 Pointers
> >3 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.
> >4 Conversion of a null pointer to another pointer type yields a null
> >pointer of that type. Any two null pointers shall compare equal.
> >
> >55) The macro NULL is defined in <stddef.h> (and other headers) as a null
> >pointer constant; see 7.17.
>
> Ich darf das mal erklären. Oben steht das NULL als (void *)0 definiert
> werden darf.
>
> Schon alleine eine Definition von NULL als (void *)0 bringt zumindest eine
> Menge Warnungen wenn nicht gar Fehler bei der meisten Software mit sich
> (z.B. FILE* p = NULL -> FILE* P = (void)0).
Was? Wieso? Klarer als der ISO-C-Standard (daraus ist das Zitat oben)
kanns doch eigentlich nicht mehr gehen. Ein Compiler, der bei sowas
eine Warnung wirft oder gar inkorrekten Code erzeugt, implementiert
irgendwas, aber sicher kein ISO-C.
> Und ich bezweifel, daß es ein Definition gibt, die besagt das (void*)0 ==
> (int)0 oder (long)0 ist. Eine Definition ob (void *)0 logisch als unwahr zu
Das ist auch nicht die Behauptung. Die Behauptung ist, dass
(void*)0 per Definitionem der Nullpointer ist (gleiches gilt natürlich
für (void*)(1/2) oder (void*)(a-a) für int a).
> Und zum Glück hatte ich nie mit solcher Hardware zu tun, ich schrieb
> lediglich das es eine solche Hardware gibt (d.h. (void *)0 != (int)0). Ich
> habe nur davon gelesen.
Der Vergleich ist wie gesagt sinnlos. Du kannst dich fragen ob folgendes
wahr ist:
void *null=NULL;
*((int*)&null)==0
-- und da gibts in der Tat keine Garantie (was weniger mit der Maschine
zu tun hat als mit dem, was sich die CompilerschreiberInnen so gedacht
haben). Ich fand es auch immer ein bisschen unglücklich, dass casts in
C manchmal nichts an den bits im Speicher ändern (das bei Casts zwischen
integern garantiert (glaube ich:-)) und dann und wann eben doch (das
ist bei casts von floats auf ints so und eben unter Umständen auch bei
casts von ints auf pointer.
Demi
Dieses Archiv wurde generiert von hypermail 2.1.4 : 16. Aug 2002 CEST