Почему С++ не печатает адрес памяти char, но будет печатать int или bool?
Возможный дубликат:
Почему адрес char не отображается?
Вот код и вывод:
int main(int argc, char** argv) {
bool a;
bool b;
cout<<"Address of a:"<<&a<<endl;
cout<<"Address of b:"<<&b<<endl;
int c;
int d;
cout<<"Address of c:"<<&c<<endl;
cout<<"Address of d:"<<&d<<endl;
char e;
cout<<"Address of e:"<<&e<<endl;
return 0;
}
Выход:
Адрес a: 0x28ac67
Адрес b: 0x28ac66
Адрес c: 0x28ac60
Адрес d: 0x28ac5c
Адрес e:
Мой вопрос:
Где находится адрес памяти char? И почему он не печатается?
Спасибо.
Ответы
Ответ 1
Я подозреваю, что версия ostream::operator<<
с перегруженной версией char *
ожидает строку C с нулевым завершением - и вы передаете ей только адрес одного символа, так что у вас есть поведение undefined, Вы должны указать адрес void *
, чтобы он печатал то, что вы ожидаете:
cout<<"Address of e:"<< static_cast<void *>(&e) <<endl;
Ответ 2
Строки в C/С++ могут быть представлены char*
, того же типа, что и &e
. Поэтому компилятор считает, что вы пытаетесь напечатать строку. Если вы хотите распечатать адрес, вы можете использовать его для void*
.
std::cout << static_cast<void *>(&e) << std::endl;
Ответ 3
Проверьте этот ранее заданный вопрос: Почему адрес char не отображается?
Кроме того, если вы используете printf("Address of e: %p \n", &e);
, это тоже сработает.