Oliver Fromme <de-bsd-questions(at)DE.FreeBSD.ORG> wrote:
> und starte mal folgendes C-Programm auf 'ner Alpha:
>
> int main() {
> char c; int *p;
> p = (int *) &c + 1;
> return *p;
> }
>
> Das fliegt Dir um die Ohren,
Nein.
Die Tücke liegt im Detail. In obigem Fall ist c »zufällig« passend
ausgerichtet.
In der Praxis kann man gelegentlich schon solchen Horror-Code finden,
gerade auch - um wieder auf den Anfang des Threads zurückzukommen - in
Programmen, die WAV-Dateien verarbeiten:
...
char *p;
long x;
...
read(fd, p, size);
...
/* read 32-bit value */
x = *(long *)p;
...
Das ist jetzt etwas plakativ, fasst aber gleich drei Probleme in einem
Beispiel zusammen:
1. Annahme, »long« sei ein 32-Bit-Typ.
Falsch auf allen 64-Bit-Plattformen.
2. Annahme, der Wert läge in passender Endianness vor.
Falsch auf der Hälfte aller Plattformen.
3. Annahme, es gäbe keine Alignment-Pflicht.
Falsch auf sparc, alpha, u.a.
Ich habe auch schon solche lustigen Dinge gesehen, wie ein Versuch
portabel die Endianness zur Laufzeit zu bestimmen:
...
char endian[] = { 0, 0, 0, 1 };
int i;
...
i = *(int *)endian;
if (i == 1)
...
-- Christian "naddy" Weisgerber naddy(at)mips.inka.de To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org with "unsubscribe de-bsd-questions" in the body of the messageReceived on Fri 22 Mar 2002 - 22:30:44 CET