Above is the code I have tried using and it stores data under *chr, it however only stores one letter rather than the entire word like for example string.
The chr is a pointer. The pointer stores an address. Dereferencing a pointer returns the value from an address.
The *chr is same as *(chr+) is same as chr[0]. That is one character. It is not "stored by chr". The chr has an address that was returned by the str.c_str().
Now you should read the documentation of all the methods of std::string to learn which of them can or will invalidate all iterators, references, and pointers to strings' data. If you use any of those, the chr will still have the same address, but it will no longer be the address of the string that the str stores.
If you do need a deep copy, then you have to allocate memory for that copy.