Going by the books, the first cout line should print me the address of the location where the char variable b is stored, which seems to be the case for the
Actually this program has problem. There is a memory leak.
char *c=new char[10];
c=&b;
This allocates 10 characters on heap, but then the pointer to heap is overwritten with the address of the variable b
.
When a char*
is written to cout
with operator<<
then it is considered as a null terminated C-string. As the address of b was initialized to a single character containing d
op<<
continues to search on the stack finding the first null character. It seems the it was found after a few characters, so dh^#
is written (the d
is the value of variable b
the rest is just some random characters found on the stack before the 1st \0
char).
If you want to get the address try to use static_cast<void*>(c)
.
My example:
int main() {
char *c;
char b = 'd';
c = &b;
cout << c << ", " << static_cast<void*>(c) << endl;
}
An the output:
dÌÿÿ, 0xffffcc07
See the strange characters after 'd'.
I hope this could help a bit!
There is a non-member overload operator<<(std::basic_ostream) for the const char*
type, that doesn't write the address, but rather the (presumed) C-style string1). In your case, since you have assigned the address of a single character, there is no NUL
terminator, and thus no valid C-style string. The code exhibits undefined behavior.
The behavior for int*
is different, as there is no special handling for pointers to int
, and the statement writes the address to the stream, as expected.
If you want to get the address of the character instead, use a static_cast
:
std::cout << static_cast<void*>( c ) << std::endl;
NUL
character ('\0'
).