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 int variable a too. But the first cout statement prints out an odd 'dh^#' while the second statement correctly prints a hex value ' ox23fd68'. Why is this happening?
#include<iostream>
using namespace std;
int main()
{
char b='d';
int a=10;
char *c=new char[10];
c=&b;
int *e=&a;
cout<<"c: "<<c<<endl;
cout<<"e: "<<e;
}
Actually this program has problem. There is a memory leak.
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 tocout
withoperator<<
then it is considered as a null terminated C-string. As the address of b was initialized to a single character containingd
op<<
continues to search on the stack finding the first null character. It seems the it was found after a few characters, sodh^#
is written (thed
is the value of variableb
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:
An the output:
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 noNUL
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 toint
, 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
:1) A C-style string is a sequence of characters, terminated by a
NUL
character ('\0'
).