【发布时间】:2014-12-15 09:51:41
【问题描述】:
我有以下程序
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.
【问题讨论】:
-
v指向一个临时的(由所有演员表创建),该临时文件在创建它的行的末尾是无效的。也许让v成为bool而不是bool*。请记住,v将始终为真,这里它指向有效的内存位置(a的地址)。试试bool v = (&a); -
Cannot reproduce。我在
stdout中没有看到216。 -
@Cyber 你确实看到了
0而不是预期的1。 UB 万岁! -
由于
p实际上并不像您说的那样指向bool,因此代码未定义,216 是一个完全合理的结果。 (输出为 216,因为如果p是bool*,则可以将*p == true替换为*p并且编译器会这样做。)
标签: c++ operators logical-operators compiler-bug