Преобразование между указателем sockaddr и указателем sockaddr_inC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Преобразование между указателем sockaddr и указателем sockaddr_in

Сообщение Anonymous »

Я наткнулся на руководство по программированию сокетов, в котором цитируется


"указатель на структуру sockaddr_in можно привести к указателю на структуру sockaddr и наоборот"


Я не понимаю, как можно привести sockaddr_in к носокадрес. Приведение указателя типа Big к типу Small должно обеспечить 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, имеющий 4 целых числа. И если у меня есть указатель типа 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<
a; //Some weird value here
return 0;
}
Предполагая, что я изменю пример так, чтобы оба класса имели одинаковый размер, настроив типы переменных... все равно макет объекта может отличаться, даже если размер останется прежним.


Подробнее здесь: https://stackoverflow.com/questions/333 ... in-pointer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»