我有以下程序
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;
或者我可以使用指向某个随机值的未初始化的 bool 指针,例如216.
最佳答案
在将指针转换为 void*
之后,您唯一可以做的事情就是将其转换回原始指针类型(在您的例子中为 int*
)。不过,您将其转换为 bool*
,这会将您带入未定义行为 的领域。或者,换句话说,您不能期望任何事情以某种方式发生。
您可能认为摆脱对 void*
的转换将解决此问题。但是,在将指针转换为不同的指针类型后取消引用指针也会导致未定义的行为。
虽然这样可以很容易地实现预期的输出:
bool v = (bool) a;
std::cout << (v == true) << std::endl;
关于C++ 比较运算符不返回 true 或 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26465234/