我一直在尝试理解严格的别名规则,因为它们适用于 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* 之外的任何类型的指针并取消引用它通常违反严格的别名规则。
这是否意味着当我接收一个 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);
}
由于基类型是 char 数组并且我将其转换为结构,因此第二个示例不起作用吗?在一个严格别名的世界里,你如何处理这种情况?