Autor: Christian Weisgerber (naddy_at_mips.inka.de)
Datum: 16. Aug 2002
Alexander Holler <holler_at_ahsoftware.de> wrote:
> Wenn jetzt z.B. ne Hardware daherkommt (was ich als eigentliche
> "Anekdote" erzählen wollte), die Unterschiede bei Zeigern auf
> verschieden Typen hat, muss ein (void*)0 bei einer Konvertierung
> in einen Interger nicht unbedingt 0 ergeben.
Das ist nach ANSI/ISO-C korrekt.
Allerdings ist die Konstante »0« magisch. Gegegeben:
foo_t *p;
Ein Vergleich
p == 0
ist per Definition identisch zu
p == (foo_t *)0
auch, wenn (foo_t *)0 vielleicht intern als 0xFFFFFFF dargestellt
wird. Das gilt auch für den impliziten Vergleich mit 0
if (!p) ...
und für Zuweisungen.
> Wenn die Hardware z.B. 1 Byte zur Unterscheidung des Zeigertyps
> benutzt (d.h. code* =0x01nnnnn, daten* = 0x02nnnnn) dann kann das
> schiefgehen.
Tagged Pointers. LISP-Maschinen hatten das. Im SPARC-Befehlssatz
findet sich auch noch ein Überbleibsel davon. Ist seit zwanzig
Jahren wieder aus der Mode.
-- Christian "naddy" Weisgerber naddy_at_mips.inka.de
Dieses Archiv wurde generiert von hypermail 2.1.4 : 16. Aug 2002 CEST