Здравствуйте, winogr, Вы писали:
W>Есть код:
W>кто может объяснить в чем некорректность?
Засыпали бедного парня цитатами из стандарта. Объяснить все надо проще, имхо.
Итак, что написано в строке:
char * p = "ABC";
Там написано, что компилятор в области статических данных( read only memory ) помещает строку "ABC". Указатель p на char хранит в себе значение адреса ячейки памяти, где расположен символ "A"
Теперь попробуем
p[0] = 'D';
Мы пытаемся записать по этому адресу другое значение. Но доступа на запись у нас туда нет — Visual Studio говорит на это четко: 0xC0000005: Access violation writing location 0x0040313c.!
( с массивами строк — аналогично ).
Работающий код выглядить должен как-то так:
char * p = new char[4];
strcpy( p, "ABC\0" );
p[0]='D';
или так:
char m[] = "ABC";
char * p = m;
p[0] = 'D';
В обоих примерах p теперь указывает на область памяти, которую можно модифицировать!
Так что различие-то не не в константах и литералах, а в памяти и указателях.