For local variables. Once you're passing the data around to other functions, the problem becomes much more complex, and it becomes much less clear when and why the compiler will be able to understand what's happening.
Not to mention, in an example like processing packets, the two views of the data WILL be simultaneously live: you're taking raw bytes on one side, interpreting some part of them as a struct to decide what's happening next, then sending the raw bytes somewhere else.
EDIT: Basically the code would look something like this:
char* buf = new char[100];
read(buf, sizeof(header));
header h;
memcpy(&h, buf, sizeof(header))
get_destination(h).write(buf);
Will this copy the header or not? How about this?
char* buf = new char[100];
read(buf, sizeof(header));
header *h = reinterpret_cast<header*>(buf); //assume we are compiling with "-fno-strict-alias", and that we know there are no alignment/packing concerns
get_destination(h).write(buf);
Also note that in C we have a somewhat cleaner solution:
union buf_header {
header h;
char buf[100];
} buffer;
read(buffer.buf, sizeof(header));
get_destination(buffer.h).write(buffer.buf);
This would of course be UB in C++ (reading from a union member that is not the last one written to).