You are falling into a deadly trap. Even in C, which is less strongly typed than C++, your compiler should issue a warning.

The MS compiler issues two:
warning C4047: '=' : 'char *' differs in levels of indirection from 'char'
warning C4313: 'printf' : '%d' in format string conflicts with argument 1 of type 'char *'

The GCC compiler issues one:
warning: assignment makes pointer from integer without a cast

Warnings are almost always errors. The difference is that the compiler will be allowed to produce some code that does something. It MIGHT actually even do something precisely as you expect.

In those areas that the standard defines as "undefined behavior" or "implementation defined behavior" the compiler writer is not constrained. He may produce an ouput that performs exactly as you would like. On the next version he may produce output that burns your house down. Either is acceptable.

Correctness is not defined by the conformance of a compiler to your expectations. Correctness is defined by the standard and the compliance of a compiler is judged by that standard.

A judgement of 100% success, even if true today, is flawed if the behavior is undefined or implementation defined.

What am I saying? I am saying turn on all warnings and errors and heed them. I am saying write code correctly. Do not accept incorrect code, even if it "works" for you. It will return and bite you squarely in the *** one day.