为什么严格别名规则允许 char* 别名其他对象指针
严格别名规则,如接受的答案中所述“严格的别名规则是什么?”,指出不同类型的指针不能用于访问同一内存位置。然而, char* 存在此规则的例外。
char 的别名异常*
尽管有严格的别名规则,但允许使用 char 给任何其他对象类型的指针起别名。这是可能的,因为 char 可以以单字节粒度访问任何地址的内存。因此, char* 可以正确读取组成任何其他类型的对象的字节。
单向别名
char 的别名异常是单程。这意味着虽然 char 可以为任何其他对象类型的指针别名,但反之则不然。其他对象类型的指针,例如 struct Something,不能用于别名 char。
不对称的原因
原因因为这种不对称性存在于数据损坏的可能性中。如果允许其他对象类型的指针为 char 别名,则可以使用对象指针更宽松的对齐规则来读取 char 的字节。这可能会导致不可预测和不正确的行为,因为 char* 的字节可能无法针对对象类型正确对齐。
示例
为了说明该异常,考虑以下示例:
char* charptr; struct something* structptr; charptr = (char*) structptr; // Allowed structptr = (struct something*) charptr; // Not allowed
在此示例中,允许将 structptr 的值分配给 charptr,因为 charptr 可以安全地对结构体的字节进行别名。但是,不允许相反的分配,因为 structptr 无法以其更严格的对齐规则正确访问 char* 的字节。
以上是为什么 char* 可以为其他对象指针起别名,但反之则不行?的详细内容。更多信息请关注PHP中文网其他相关文章!