【发布时间】:2014-02-26 20:54:21
【问题描述】:
如果我有一个指针 (unsigned long *uptr) 指向 (unsigned long) 的数组 - 或任何具有(通常)比 (char) 更严格对齐要求的类型 - 并强制转换:
char *bptr = (char *) uptr; /* always works. */
将(bptr) 转换为(unsigned long *) 是否会产生原始指针?我意识到将转换为具有更严格对齐要求的指针可能不会产生可以安全解除引用的指针,一般来说。但是标准是否保证这种情况下指针值的往返呢?
我无法想象(char *) 的实现不能按预期工作,因为它必须在其表示中至少有尽可能多的位来寻址字节。其他答案使 general 情况清楚。我从来没有想过这是否得到保证。
【问题讨论】:
-
转换为
char*并返回原始类型始终有效。 -
如果您的原始指针指向
unsigned long或分配的内存大小等于或大于unsigned long。然后标准保证对齐。但它违反了严格的别名。 -
@Nick char 允许为任何类型设置别名。
-
@self 到
char,但不是从char到不兼容的类型。 -
在 C++11 中你会因为 C++11 5.2.10/7 没问题。
标签: c pointers casting language-lawyer