У меня есть следующая программа
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?
--------- РЕДАКТИРОВАТЬ ---------
Мое намерение состоит не в том, чтобы отбрасывать в пустоту, а в том, чтобы хранить 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;
bool
путем приведения bool*
к int*
а затем разыменования int*
для установки значения. Если это так, пожалуйста, проверьте второй абзац моего ответа - это также приводит к неопределенному поведению.
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
Конечно, это догадка после моих экспериментов...
Благодаря вам после этого я всегда что-то использую! = False, а не что-то == true...
или что-то == ложное вместо чего-то! = true...
v
указывает на временный (созданный из всех приведений), который недопустим в конце строки, которая его создала. Может быть, сделатьv
bool
неbool*
. Имейте в виду, чтоv
всегда будет истинным, здесь оно указывает на правильную ячейку памяти (адресa
). Попробуйтеbool v = (&a);
216
в стандартныйstdout
.