我一直在試圖理解嚴格的別名規則,因爲它們適用於字符指針。對於嚴格的指針別名,char *安全嗎?
Here這是說:
它總是假定一個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 *以外的任何類型的指針並將其解除引用通常違反了嚴格的別名規則。
這是否意味着,當我的recv字符數組,我不能重新解釋投一個struct當我知道消息的結構:
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數組,我將它轉換爲一個結構?你如何在嚴格的別名世界中處理這種情況?
第二段代碼是否要求你明確陳述?你是否啓用了所有警告? – 2017-11-13 02:40:37