кастинг между sockaddr и sockaddr_in
Я наткнулся на учебник по программированию сокетов, в котором он цитируется
"указатель на struct sockaddr_in может быть приведен к указателю на struct sockaddrи наоборот"
Я не понимаю, как sockaddr_in может быть приведен к sockaddr. Приведение указателябольшой введите вМаленький Тип должен давать поведение UD.
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
};
Как актерский состав не может быть неопределенным? Разве небезопасно бросать их друг другу?
Если у меня есть класс A, имеющий только два целых, и класс B, имеющий четыре целых. И если у меня есть указатель типа B, и я приведу его к типу A, тогда я уверен, что смогу получить первые два элемента. Но если класс A имеет 2 символа, объявленных первыми, и 2 объекта, объявленных позже, то указатели не будут правильно извлекать значения, поскольку расположение объектов в этом случае будет другим.
Изменить 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;
}
Предполагая, что я изменил пример, чтобы оба класса имели одинаковый размер путем настройки типов переменных ... все же расположение объектов может отличаться, даже если размер остается неизменным.