int i = 42;
int *p1 = &i;
int long *p2 = (long*)p1;
这是未定义的行为吗?在 C++ 中,我认为出于某种原因它是实现定义的行为。
我查看了 C 标准:
C99 6.3.2.3/7 指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针。如果结果指针未正确对齐 57) 指向的类型,则行为未定义。否则,当再次转换回来时,结果将等于原始指针。
57) 一般来说,“正确对齐”的概念是可传递的:如果指向类型 A 的指针正确对齐指向类型 B 的指针,而指向类型 B 的指针又正确对齐指向类型 C 的指针,则指向类型 A 的指针是为指向 C 类型的指针正确对齐。
在实践中,术语正确对齐是什么意思?你怎么知道你是否正确地执行了它而不进入未定义的行为?