Ich habe versucht, die strengen Aliasing-Regeln zu verstehen, wie sie für den Char-Zeiger gelten.Wann ist char * sicher für striktes Pointer-Aliasing?
Here dies angegeben:
Es wird immer davon ausgegangen, dass ein char * zu einem Aliasnamen eines Objekts bezieht.
Ok so im Zusammenhang mit der Buchse Code, kann ich dies tun:
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);
};
Aber dann gibt es diese Aussage
Das Gegenteil ist nicht wahr. Das Übergeben eines char * an einen Zeiger eines anderen Typs als char * und das Dereferenzieren dieser Eigenschaft widerspricht normalerweise der strengen Aliasing-Regel.
Bedeutet dies, dass, wenn ich ein Char-Array empf ich nicht gegossen auf eine Struktur neu interpretieren kann, wenn ich die Struktur der Nachricht kennen:
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);
}
Wird dieses zweite Beispiel nicht funktionieren, weil die Basistyp ist ein Char-Array und ich werfe es auf eine Struktur? Wie gehst du mit dieser Situation in einer genau definierten Welt um?
Erfordert der zweite Teil des Codes nicht das explizite Übergeben? Hast du alle Warnungen aktiviert? –