对"C: When is casting between pointer types not undefined behavior?"的回答表明,通过没有更严格对齐要求的指针向前和向后投射是安全的。
即使类型不完整,对齐也很重要,如标准所示:
指向对象或不完整类型的指针可能会转换为指向其他对象的指针 对象或不完整的类型。如果结果指针未正确对齐 为了 指向类型,行为未定义。否则,当再次转换回来时, 结果应比较等于原始指针。当指向对象的指针是 转换为指向字符类型的指针,结果指向最低寻址字节 物体。结果的连续增量,直到对象的大小,产生指针 到对象的剩余字节。
现在的问题是struct X;
的正确对齐要求是什么。当然,如果它是完整的,它将取决于它的内容,但如果它是不完整的(它只被声明为struct X*
)怎么办?换句话说,我们可以从struct Y*
转换为struct X
然后再返回并获得相同的指针吗?
如果完整struct X*
和不完整的对齐要求不同会是一个并发症吗?我无法在它们之间进行实际转换,但可能是您在struct X
完成的上下文之间的转换之间传递了{{1}}。或者这是一个总是允许的特殊情况?