Zitat von
locus vivendi
Aber das ist ja gerade der Inhalt des Zitates aus dem C-Standard, dass Zeiger die von malloc kommen geeignet ausgerichtet sind. Das muss auch so sein, weil malloc ja nicht weiß welches Objekt (bzw. welcher Typ von Objekt) in dem zu allozierenden Speicher gespeichert werden soll. Daher muss malloc einen Zeiger liefern, der so ausgerichtet ist, dass jeder mögliche Typ hinein passt.
Jetzt bin ich dahinter gekommen, was Du meinst ;-) - der malloc soll es richten, dass typunabhängig eine gültige Adresse rauskommt. Ok, hört sich erstmal logisch an. Ich habe mir mal ein kleines C-Progrämmchen gebastelt, um das zu testen:
Code:
jan@jack:~/tmp> cat t_m.c
#include <stdio.h>
#include <malloc.h>
int main(int argc, char **argv) {
struct s_t {
short p2;
long p3;
char p1[243];
} t, *pt;
char *str;
char s[249];
printf("%u\n", s);
str = malloc(sizeof(struct s_t));
printf("%u\n", str);
pt = malloc(sizeof(struct s_t));
printf("%u\n", pt);
t = *(struct s_t *)pt;
t = *(struct s_t *)str;
t = *(struct s_t *)s;
return(0);
}
Läuft auf meiner Linux-Kiste sauber durch:
Code:
jan@jack:~/tmp> ./t_m
3221213648
134520840
134521096
Morgen werde ich das mal auf unserer Solaris-Möhre ausprobieren, ich melde mich dann mit dem Ergebnis - bin gespannt, ob sich Solaris an den C-Standard hält. Spätestens bei der letzten Zuweisung an t sollte eigentlich nach meinen Erfahrungen Schluss mit lustig sein, das wäre der Fall aus dem Originalposting.
Jan
Lesezeichen