任何人都可以举例
Boolean_conversions Using reinterpret_cast<>
我得到执行失败。任何一个解释..
例如:
void Boolean_Conversions()
{
bool b = 0;
int *i = reinterpret_cast<int*> (&b);
// iam expecting as *i is 0/false ,but it is showing runtime error
}
编辑: 在ISO标准中 第5.2.10节,第1段:
"The result of the expression reinterpret_cast<T>(v) is the
result of converting the expression v to type T. If T is a
reference type, the result is an lvalue; otherwise, the re
sult is an rvalue and the l-value to r-value (4.1), array
to pointer (4.2), and function to pointer (4.3) standard c
onversions are performed on the the expression v. Types sh
all not be defined in a reinterpret_cast."
从这个Iam尝试..我做了很多转换..像Array_to_Pointer,Function_To_Pointer,Integral / Pointer_Conversions等...但我不知道为什么它失败了布尔转换。
任何人都可以告诉它失败的原因..否则使用reinterpret_cast告诉布尔转换。
主要是在G ++中给运行时失败.CC / EDG / COdepad..etc编译器
请解释
答案 0 :(得分:2)
不,输出未定义。请注意,转换未定义。
在我的机器上* i = 0xcccccc00
注意lsb是00
,它对应于用0初始化的bool变量的值(false)。其他三个字节中的字节模式(假设int的大小为32位)是完全未指定的,取决于该内存/字节序中的内容等。
从技术上讲,这是一个未定义的行为,因为我们正在引用一个我们没有保留/分配的内存位置(全部)。
答案 1 :(得分:1)
你还没说清楚你要做什么!你是否意识到有三个演员:
TO_TYPE DEST_VAL = static_cast<TO_TYPE>(SOME_VAL);
TO_TYPE DEST_VAL = dynamic_cast<TO_TYPE>(SOME_VAL);
和你挂的那个:
TO_TYPE DEST_VAL = reinterpret_cast<TO_TYPE>(SOME_VAL);
在这三个中,最后一个是最危险的,基本上你忽略了编译器告诉你的关于类型和强迫你的方式的所有东西!这意味着你知道自己在做什么,在大多数情况下,你不知道。
通常情况下,你应该只使用最后一个作为最后的度假村,而其他两个演员不能做你需要的,你仔细看了设计,并咨询了预言家等!它不是类型安全的,并且它不保证生成的对象是您期望的,就像您在上面尝试的那样。bool
和int
可能有也可能没有相同的对齐存储并指向bool
的地址,其指针应指向int
,并且取消引用可能导致可能访问各种内存的内存区域...
答案 2 :(得分:0)
bool b = 0;
int *i = reinterpret_cast<int*> (&b);
这会将b
的内存地址“转换”为i
指针的合适样式后存储到int
。如果您希望将bool
投射到int
,只需执行
int i = reinterpret_cast<int> (b);
如果b
为false
,则确实为0
,否则为1
。
你不需要reinterpret_cast<int>
。阅读在线程上发表的其他评论,它将变得清晰。