मैं सख्त एलियासिंग नियमों को समझने की कोशिश कर रहा हूं क्योंकि वे चार सूचक पर लागू होते हैं।सख्त पॉइंटर एलियासिंग के लिए char * सुरक्षित कब होता है?
Here इस कहा गया है:
यह हमेशा माना जाता है कि एक चार * किसी भी वस्तु का एक अन्य नाम का उल्लेख कर सकते।
ठीक सॉकेट कोड के संदर्भ में ऐसा है, तो मैं यह कर सकता:
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 * कास्टिंग करना और इसे संदर्भित करना आमतौर पर सख्त एलियासिंग नियम का उल्लंघन होता है।
इसका मतलब यह है कि जब मैं एक चार सरणी 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);
}
यह दूसरा उदाहरण वजह से काम नहीं करेंगे आधार प्रकार एक चार सरणी है और मैं इसे एक संरचना में कास्टिंग कर रहा हूँ? सख्ती से अलियाकृत दुनिया में आप इस स्थिति को कैसे संभालेंगे?
क्या कोड के दूसरे भाग में आपको स्पष्ट रूप से कैसर की आवश्यकता नहीं है? क्या आपने सभी चेतावनियां सक्षम की हैं? –