2014-10-20 127 views
0

我有以下真或假的程序C++相比,运营商没有返回

int a = 216; 
bool* v = (bool*)((void*)&a); 
std::cout << (*v == true) << endl; 

我希望这个程序打印出真或假,而是它打印出216我与g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2编译它。预计会出现行为还是一些错误?为什么等号运算符会返回不同于bool的类型?

--------- ---------编辑

我的意图不是转换为void而是使V存储216在内存中的位置。替代方案可能是这样的:

bool v; 
int a = 216; 
memcpy(&v, &a, sizeof(bool)); 
std::cout << (v == true) << endl; 

或者,我可以拿未初始化的布尔指针,它指向这恰好是例如一些随机值

+1

'v'指向临时(由所有演员创建),在创建它的行的末尾无效。也许让'v'成为'bool'不是'bool *'。请记住,'v'将始终为真,这里指向有效的内存位置('a'的地址)。尝试'bool v =(&a);' – Niall 2014-10-20 12:04:14

+0

[无法重现](http://ideone.com/aTWLm8)。我没有在'stdout'中看到'216'。 – CoryKramer 2014-10-20 12:05:27

+0

@Cyber​​你看到'0'而不是预期的'1'虽然_Horray for UB!_ – Baldrickk 2014-10-20 12:21:33

回答

5

在投射指向void*之后,您可以执行的唯一有效操作是将其转换回原始指针类型(在您的案例中为int*)。您将它投射到bool*虽然,这会将您带入未定义的行为的域。换句话说,你不能指望任何事情以某种方式发生。

您可能认为摆脱剧组到void*将解决此问题。但是,在将其转换为不同的指针类型之后解引用指针也会导致未定义的行为。

预期的输出可以容易地实现,虽然这种方式:

bool v = (bool) a; 
std::cout << (v == true) << std::endl; 
+0

只有指向某个内存位置有216你可以试着用不同的方式来完成,例如你可以写216到保存为bool的内存位置,结果将是相同的。 – Trismegistos 2014-10-20 12:28:40

+0

@Trismegistos:这听起来像是通过将'bool *'强制转换为'int *',然后取消引用'int *'来设置值,将一个整数值写入'bool'变量。如果是这样,请检查我的答案的第二段 - 这也会导致未定义的行为。 – 2014-10-20 12:35:37

+0

@Trismegistos:从更新到你的问题,你似乎已经使用了'memcpy'和两种不同的指针类型。基于同样的原因,这又是一次未定义的行为:您试图将“int”值视为“bool”值。不要试图绕过类型安全 - 没有什么好的可以来。 – 2014-10-20 12:45:35

0
int a = 216; 
bool* v = (bool*)((void*)&a); 
std::cout << (*v == true) << endl; 

一个= 216 = 128 + 64 + 16 + 8 = 00000 ... 11011000

* V = 1000如果我们打印出来,那就说明真的...

但真正= 0001,它是不是满足* v ==真

当然是有点GUE中我的实验后,SS ...

多亏了你之后,我一直使用的东西!=假的东西,而不是真正的== ...

什么==假的,而不是其他!=真...