Frage zum Casting (Typenkonvertierung)

21/02/2013 - 12:09 von Alexander Ausserstorfer | Report spam
Hallo,

ich habe da ein kleines (lauffàhiges) Programm, bei dem ich eine
Typenkonvertierung nicht ganz verstehe:

struct hostent *hostinfo;
struct sockaddr_in name;

[...]

hostinfo=gethostbyname(servername);

[...]

name->sin_addr = *(struct in_addr *) hostinfo->h_addr;

Es wird also die IP-Nummer ermittelt und binàr in hostinfo
gespeichert. Nun wird diese binàre Nummer in eine (Unter-)Struktur vom
Typ sockaddr_in kopiert. Die dazu notwendige Umwandlung

*(struct in_addr *)hostinfo->h_addr;

verstehe ich nicht ganz. Ich gehe davon aus, dass hostinfo->h_addr auf
den Inhalt zurückgreift, der an dieser Stelle hinterlegt ist. Nun wird
dieser Inhalt aber in einen Zeiger vom Typ struct in_addr *
umgewandelt und danach mittels * wieder auf dessen Inhalt
zurückgegriffen. Für mich ergibt das aber keinen Sinn, weil hostinfo-

h_addr hier ein Zeiger sein müsste (meine Annahme)?



Und warum kann man nicht einfach

(struct in_addr) hostinfo->h_addr;

schreiben? Danke für eure Erklàrungen und Hilfen!

Alex

http://home.chiemgau-net.de/ausserstorfer/
 

Lesen sie die antworten

#1 Rainer Weikusat
21/02/2013 - 13:40 | Warnen spam
Alexander Ausserstorfer writes:
struct hostent *hostinfo;
struct sockaddr_in name;

[...]

hostinfo=gethostbyname(servername);

[...]

name->sin_addr = *(struct in_addr *) hostinfo->h_addr;



Eine erste Bemerkung: Das funktioniert zwar so, verletzt aber die
aliasing-Regeln von C. Um mit diesen konform zu sein muesste man hier

memcpy(&name->sin_addr, hostinfo->h_addr, sizeof(name->sin_addr))

benutzen.


Es wird also die IP-Nummer ermittelt und binàr in hostinfo
gespeichert. Nun wird diese binàre Nummer in eine (Unter-)Struktur vom
Typ sockaddr_in kopiert. Die dazu notwendige Umwandlung

*(struct in_addr *)hostinfo->h_addr;

verstehe ich nicht ganz. Ich gehe davon aus, dass hostinfo->h_addr auf
den Inhalt zurückgreift, der an dieser Stelle hinterlegt ist. Nun wird
dieser Inhalt aber in einen Zeiger vom Typ struct in_addr *
umgewandelt und danach mittels * wieder auf dessen Inhalt
zurückgegriffen. Für mich ergibt das aber keinen Sinn, weil hostinfo-
h_addr hier ein Zeiger sein müsste (meine Annahme)?





h_addr ist ein Makro, dass als h_addr_list[0] definiert ist. Der Typ
von h_addr_list ist char **, dh ein Zeiger auf ein Feld von Zeigern
auf char-Felder. h_addr ist also aequivalent zu dem ersten Zeiger, der
in dem Feld, auf das h_addr_list zeigt, gespeichert ist, dh es ist ein
Zeiger auf das char-Feld, in dem die 'rohe' IP-Addresse gespeichert
ist. Der Wert von

(struct in_addr *)hostinfo->h_addr

ist also ein Zeiger, der auf eine struct in_addr zeigt, die sich an
derselben Addresse befindet.

*(struct in_addr *)hostinfo->h_addr

dereferenziert diesen Zeiger, das Resultat ist also (wie gewuenscht),
die Struktur selber.

(struct in_addr)hostinfo->h_addr

wuerde den Wert des Zeigers h_addr, also die Addresse, an der die
gesuchte Internet-Addresse gespeichert ist, als Internet-Addresse
interpretieren.

Ähnliche fragen