Когда char * безопасен для строгого наложения указателей?
Я пытался понять строгие правила псевдонимов, поскольку они применяются к указателю на символ.
Вот это заявлено:
Всегда предполагается, что char * может ссылаться на псевдоним любого объекта.
Итак, в контексте кода сокета, я могу сделать это:
struct SocketMsg
{
int a;
int b;
};
int main(int argc, char** argv)
{
// Some code...
SocketMsg msgToSend;
msgToSend.a = 0;
msgToSend.b = 1;
send(socket, (char*)(&msgToSend), sizeof(msgToSend);
};
Но тогда есть это утверждение
Обратное неверно. Приведение char * к указателю любого типа, кроме char *, и разыменование его, как правило, нарушают правило строгого наложения имен.
Означает ли это, что когда я получаю массив символов, я не могу переосмыслить приведение к структуре, когда знаю структуру сообщения:
struct SocketMsgToRecv
{
int a;
int b;
};
int main()
{
SocketMsgToRecv* pointerToMsg;
char msgBuff[100];
...
recv(socket, msgBuff, 100);
// Ommiting make sure we have a complete message from the stream
// but lets assume msgBuff[0] has a complete msg, and lets interpret the msg
// SAFE!?!?!?
pointerToMsg = &msgBuff[0];
printf("Got Msg: a: %i, b: %i", pointerToMsg->a, pointerToMsg->b);
}
Этот второй пример не будет работать, потому что базовый тип - это массив символов, и я приведу его к структуре? Как вы справляетесь с этой ситуацией в строго псевдонимном мире?