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配列をrecvするときに、メッセージの構造がわかっている場合、構造体へのキャストを再解釈できないことを意味しますか?
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 配列であり、構造体にキャストしているため、この 2 番目の例は機能しませんか? 厳密にエイリアス化された世界で、この状況をどのように処理しますか?