casting zwischen sockaddr und sockaddr_in
Ich bin auf ein Tutorial zur Socket-Programmierung gestoßen, in dem es mit @ angegeben is
"Ein Zeiger auf eine Struktur sockaddr_in kann in einen Zeiger auf eine Struktur sockaddr @ umgewandelt werdeund umgekehr"
Ich verstehe nicht, wie sockaddr_in in sockaddr umgewandelt werden kann. Zeiger auf @ setzGro Typ zuKlei Typ sollte UD Verhalten geben.
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
struct sockaddr_in {
short int sin_family; // Address family, AF_INET
unsigned short int sin_port; // Port number
struct in_addr sin_addr; // Internet address
unsigned char sin_zero[8]; // Same size as struct sockaddr
};
Wie kann die Besetzung nicht undefiniert sein? Ist es nicht unsicher, diese miteinander zu verbinden?
Wenn ich eine Klasse A mit nur zwei Zoll und Klasse B mit 4 Zoll habe. Und wenn ich einen Zeiger vom Typ B habe und ihn auf Typ A umwandle, dann kann ich sicher die ersten beiden Elemente holen. Wenn Klasse A jedoch zuerst 2 Zeichen und später 2 Ints deklariert hat, werden die Werte durch die Zeiger nicht richtig abgerufen, da das Objektlayout in diesem Fall unterschiedlich wäre.
Edit 1:
class Anu
{
public:
char a;
int b;
Anu()
{
a='a';
}
};
class Anurag
{
public:
Anurag() { a=4;}
int a;
int b;
int c;
int d;
};
int main()
{
Anu objanu;
Anurag objanurag;
Anurag *ptrAnurag= &objanurag;
ptrAnurag= (Anurag*)&objanu;
cout<<ptrAnurag->a; //Some weird value here
return 0;
}
Angenommen, ich ändere das Beispiel so, dass beide Klassen dieselbe Größe haben, indem ich die Variablentypen anpasse. Das Objektlayout kann jedoch unterschiedlich sein, auch wenn die Größe gleich bleibt.