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.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage