Tôi đã cố gắng hiểu các quy tắc bí danh nghiêm ngặt khi chúng áp dụng cho con trỏ char.Khi nào char * an toàn cho việc đánh dấu con trỏ nghiêm ngặt?
Here này được nêu:
Người ta luôn luôn coi đó là một char * có thể tham khảo một bí danh của bất kỳ đối tượng.
Ok như vậy trong bối cảnh của mã ổ cắm, tôi có thể làm điều này:
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);
};
Nhưng sau đó có tuyên bố này
Các converse là không đúng sự thật. Đúc một char * vào một con trỏ thuộc bất kỳ kiểu nào khác hơn là char * và dereferencing nó thường vi phạm quy tắc bí danh nghiêm ngặt.
Điều này có nghĩa rằng khi tôi recv một mảng char, tôi không thể diễn giải lại dàn diễn viên cho một struct khi tôi biết cấu trúc của thông điệp:
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);
}
sẽ ví dụ thứ hai này không làm việc vì loại cơ sở là một mảng char và tôi đang đúc nó vào một cấu trúc? Làm thế nào để bạn xử lý tình trạng này trong một thế giới bí danh nghiêm ngặt?
Không phải đoạn mã thứ hai yêu cầu bạn phải viết rõ ràng? Bạn đã bật tất cả cảnh báo chưa? –