Защищенность и валидность данных.
char* stringArray[]={"Строка 1","Строка 2","Третья строка","Еще одна строка","5-я строка"};
Как его обрабатывает компилятор?
В области памяти создается 5 нуль строк, затем адрес каждой строки заносится в безразмерный массив.
Будут ли при этом валидны сами строки, после занесения их указателей в массив? Или будут валидны только указатели на них?
Изменится ли что то, если добавить спецификатор const?
с сегменте, защищенном от записи, заранее создаются строки, явно указанные в программе, одинаковые строки размещаются под одним и тем же адресом.
Затем эти адреса копируются в массив. Вот и все.
Использование подобных массивов без спецификатора const - не имеет смысла, т.к. записывать в сами строки всеравно не получиться. Просто программа вылетет, как наткнется на запись в эту область. Возможно в каких-то компиляторах такую махинацию и можно провести, но такое как раз лучше присекать.
А вот есть еще одна простая конструкция, о существовании котрой возможно не каждый программист задумывался:
Теперь не только нельзя менять содержимое строк, но и сами указатели в массиве (формально).
Вообще хочу от себя сказать, что ключевое слово const пожалуй самое загадочное из всех. На первый взгляд кажется, что ничего особенного в нем нет, но это пока не вникнешь в его сущность. Ему посвящена глава в какой-то книге Джеффа Элджера - рекомендую почитать.
Т.е. при появлении строки, компилятор создает массив константных значений типа const char защищенных от изменений?
И эти строки будут валидными до конца программы? Т.е. можно использовать такую конструкцию как массив константных строк?
Т.е. при появлении строки, компилятор создает массив константных значений типа const char защищенных от изменений?
И эти строки будут валидными до конца программы? Т.е. можно использовать такую конструкцию как массив константных строк?
Не совсем понятно что вы имеете ввиду. Попробую еще раз объяснить.
Все явно указанные строки в программе на этапе компиляции заносятся в сегмент, защищенный от записи. Соответственно никто не сможет ни удалить, не перенести их, отсюда следует что и их адрес также будет все времмя постоянным. Адрес можно интерпретировать как угодно: char*,void *,int,или даже указатель на собственный класс, но только const char * будет отображать сущность этой области памяти.
Создавая подобный массив из char* или const char* вы просто записываете эти заранее определенные адреса в массив и напротяжении всей работы программы они будут действительными.
Сделайте проверку этого факта сами. Создайте в какой-нибудь функции массив на строки. Создайте еще какие-то переменные инициализуемые этими же строками, посмотрите у каждой их адреса. После выхода из функции создайте еще массивы или переменные для тех же строк, опять посмотите на адреса и все станет ясно.
Массив константных строк всегда можно использовать, но только если он инициализируется не явной строкой, то нужно будет обеспечивать ее сохранность.