Re: Инициализация массива строк
От: ariets  
Дата: 11.03.09 12:22
Оценка: 2 (2)
Здравствуйте, 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 теперь указывает на область памяти, которую можно модифицировать!

Так что различие-то не не в константах и литералах, а в памяти и указателях.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.