char *str = "hello world"; str = 'H';
"hello world" is a string literal, so modifying it gives undefined behaviour.
The initialisation of
str in the above example was formally deprecated (scheduled for removal from a future version of the standard) in C++03. A number of compilers before 2003 might issue a warning about this (e.g. a suspicious conversion). After 2003, compilers typically warn about a deprecated conversion.
The above example is illegal, and results in a compiler diagnostic, in C++11 and later. A similar example may be constructed to exhibit undefined behaviour by explicitly permitting the type conversion, such as:
char *str = const_cast<char *>("hello world"); str = 'H';