0

我有以下程序

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

我希望这个程序打印出 true 或 false,但它打印出 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;

或者我可以采用未初始化的布尔指针,它指向某个随机值,例如 216。

4

2 回答 2

5

将指针转换为 后唯一有效的事情void*是将其转换回原始指针类型(在您的情况下int*)。但是,您将其转换为bool*,这会将您带入未定义行为的领域。或者,换句话说,你不能期望任何事情会以某种方式发生。

你可能会认为摆脱演员阵容void*会解决这个问题。但是,在将指针转换为不同的指针类型后取消引用它也会导致未定义的行为。

但是,可以通过这种方式轻松实现预期输出:

bool v = (bool) a;
std::cout << (v == true) << std::endl;
于 2014-10-20T12:07:10.760 回答
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...

但是 true=0001 并且不满足 *v==true

当然,经过我的实验,这有点猜测......

多亏了你,在那之后我总是使用一些东西!=假而不是东西==真......

或某事==假而不是某事!=真...

于 2014-10-20T13:14:14.160 回答