Hallo, On Tue, 17 Dec 2002, Thorsten Haude wrote:
* David Haller
[2002-12-09 22:42]: Das nicht. Wo wird hier konvertiert, außer von 0 zu (void*) 0 ?
s.o. "per definitionem" muss es egal sein.
Hier hast Du mich wieder verloren. Du schreibst doch die ganze Zeit, daß Zeiger und Integer nicht gleich sind!?
Sind sie ja nicht. Nur definiert der Standard (IIRC), dass bei Vergleichen etc. ein 0 / (void*)0 zu INVALID_POINTER konvertiert werden muss. D.h.: foo * bar; if( bar == 0 ) /* -> bar == INVALID_POINTER? */ if( bar == (void*)0 ) /* -> bar == INVALID_POINTER? */ Dabei "muss" INVALID_POINTER _nicht_ 0x0 sein. In der Praxis _ist_ es aber meist (immer?) 0x0. Eine Implementation koennte z.B. folgendes machen: sizeof(ptr_t) := 4 sizeof(int64_t) := 8 INVALID_POINTER := (int64_t)-1 ueber den (Un)Sinn einer solchen Konstruktion will ich nicht reden, aber es kann z.B. HW geben, die irgendein Register oder sonstwas in der Richtung zur Verfuegung stellt oder weiss der Geier.
Der Vergleich ptr == NULL ist IMO vorzuziehen, sofern die Implementation ein NULL bietet.
NULL ist ANSI-C.
[ ] alle Compiler setzen ANSI-C vollstaendig und korrekt um -dnh -- Die Tastatur finden Sie, indem Sie das Kabel verfolgen, ds mit einem 5poligen DIN-Stecker an der Rückseite Ihres Rechners angebracht ist. [CrossPoint-Hilfe]