tumanovalex, ну вот такая вольность в стандарте - позволяет без ограничений инициализировать обычный указатель адресом read-only памяти. С оговоркой про неопределённое поведение.
Кстати, какая версия Visual C++? У меня на 2003й не компилировался другой фрагмент: "p = malloc(128);" - требовалось явно привести тип к char*. А с символами стандарт C++ выражается поточнее:
An ordinary string literal has type “array of n const char” and static storage duration
То есть, это массив константных символов. Сам указатель, инициализированный адресом такого массива, модифицировать можно сколько угодно - нельзя трогать содержимое.
Я так понимаю, не нашли хорошего способа обойти проблему с типами: ведь указатель на массив констант - это особый тип, а часто нужно использовать его наравне с обычным указателем на символы. В тех же сравнениях или при копировании, или выводе на экран. Проще сказать "помните, что туда писать нельзя" - тем более, что окончательно запретить это силами языка, вроде, нельзя совсем. "Если очень хочется, но нельзя, - то можно, с непредсказуемыми последствиями" - вот примерно такая ситуация получается с доступом к константным данным, в общем случае.