问题
Why does
#include <iostream>
using namespace std;
int main() {
cout << (char*)0x10 << endl;
}
segfault, but
#include <iostream>
using namespace std;
int main() {
cout << (void*)0x10 << endl;
}
seems to work just fine?
回答1:
Because
cout::operator <<(void*)
prints a memory address, and
cout::operator <<(char*)
prints a null-terminated character array, and you run into undefined behaviour when you attempt to read the char
array from 0x10
.
回答2:
The ostream::operator<< is overloaded, there is a version for char* which interprets the given pointer as a null-terminated string.
回答3:
There's a special overload for <<
with char*
, so that C-style strings can be output easily.
Thus
cout << (char*)0x10 << endl;
tries to print out the string located at (char*)0x10
which is not memory it's supposed to look at.
来源:https://stackoverflow.com/questions/11749725/printing-a-pointer-with-iostream