往返指针铸造对齐

时间:2014-02-26 20:54:22

标签: c pointers casting language-lawyer

如果我有一个(unsigned long *uptr)数组的指针(unsigned long) - 或任何类型({通常)更严格的对齐要求而不是(char) - 并且强制转换:

char *bptr = (char *) uptr; /* always works. */

(bptr)转换为(unsigned long *)会产生原始指针吗?我意识到将转换为一个具有更严格对齐要求的指针可能不会产生一个可以安全地去反射的指针,一般。但是,在这种情况下,标准是否保证指针值的往返?

我无法想象(char *)的实现,其中这将无法按预期工作,因为它必须在其表示中至少有多少位来寻址字节。其他答案使一般案例清晰。我从未想过要质疑这是否得到保证。

2 个答案:

答案 0 :(得分:2)

看起来你很好。 C11 6.3.2.3/7说:

  

指向对象类型的指针可以转换为指向不同对象类型的指针。如果   结果指针未正确对齐引用类型,行为是   未定义。否则,当再次转换回来时,结果应该等于   原始指针。当指向对象的指针转换为指向字符类型的指针时,   结果指向对象的最低寻址字节。连续增量   结果,直到对象的大小,产生指向对象剩余字节的指针。

答案 1 :(得分:1)

是。

引用与Kerrek相同的文本块,因为char *指针必须是correctly aligned for the referenced type,否则将避免使用未定义的行为result shall compare equal

如果它是除char以外的任何类型,或者如果更改char *指针的值,那么指针可能不再是correctly aligned而你又回到了UB。

你正在走一条狭窄的线路,但去那里是绝对安全的。