我有以下程序
int a = 216;
bool* v = (bool*)((void*)&a);
std::cout << (*v == true) << endl;
我希望这个程序能打印出真或假,但它打印出216.我用g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
编译了它。这是预期的行为还是一些错误?为什么等式运算符会返回与bool不同的类型?
---------编辑---------
我的意图是不要将其置于无效状态,而是将v存储216存储在其内存位置。替代程序可能如下所示:
bool v;
int a = 216;
memcpy(&v, &a, sizeof(bool));
std::cout << (v == true) << endl;
或者我可以使用未初始化的bool指针指向某个随机值,该指针恰好是例如216。
答案 0 :(得分:5)
在向void*
转换指针后,您可以执行的唯一有效操作是将其强制转换为原始指针类型(在您的情况下为int*
)。您将其转换为bool*
,这会将您带入未定义行为的域中。换句话说,你不能指望任何事情以某种方式发生。
你可能会认为摆脱void*
的演员表会解决这个问题。但是,在将指针强制转换为不同的指针类型后取消引用该指针也会导致未定义的行为。
虽然可以通过这种方式轻松实现预期的输出:
bool v = (bool) a;
std::cout << (v == true) << std::endl;
答案 1 :(得分:0)
int a = 216;
bool* v = (bool*)((void*)&a);
std::cout << (*v == true) << endl;
a = 216 = 128 + 64 + 16 + 8 = 00000 ... 11011000
* v = 1000,如果我们打印它,它显示为真......
但是true = 0001且不满足* v == true
当然,在我的实验之后有点猜测......
感谢你,之后我总是使用一些东西!= false而不是某些东西== true ...
或某事= = false而不是某事!= true ...