Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Защищенность и валидность данных.

590
05 декабря 2007 года
Gigahard
223 / / 03.04.2006
Корректен ли на валидность следующий код:

char* stringArray[]={"Строка 1","Строка 2","Третья строка","Еще одна строка","5-я строка"};

Как его обрабатывает компилятор?

В области памяти создается 5 нуль строк, затем адрес каждой строки заносится в безразмерный массив.
Будут ли при этом валидны сами строки, после занесения их указателей в массив? Или будут валидны только указатели на них?
Изменится ли что то, если добавить спецификатор const?
505
05 декабря 2007 года
vAC
343 / / 28.02.2006
компилятор поступает следующим образом:
с сегменте, защищенном от записи, заранее создаются строки, явно указанные в программе, одинаковые строки размещаются под одним и тем же адресом.
Затем эти адреса копируются в массив. Вот и все.
Использование подобных массивов без спецификатора const - не имеет смысла, т.к. записывать в сами строки всеравно не получиться. Просто программа вылетет, как наткнется на запись в эту область. Возможно в каких-то компиляторах такую махинацию и можно провести, но такое как раз лучше присекать.
 
Код:
const char *s[]={"...", ...}

А вот есть еще одна простая конструкция, о существовании котрой возможно не каждый программист задумывался:
 
Код:
const char *const s[]={"...", ...};

Теперь не только нельзя менять содержимое строк, но и сами указатели в массиве (формально).

Вообще хочу от себя сказать, что ключевое слово const пожалуй самое загадочное из всех. На первый взгляд кажется, что ничего особенного в нем нет, но это пока не вникнешь в его сущность. Ему посвящена глава в какой-то книге Джеффа Элджера - рекомендую почитать.
590
05 декабря 2007 года
Gigahard
223 / / 03.04.2006
Использование подобных массивов без спецификатора const - не имеет смысла, т.к. записывать в сами строки всеравно не получиться.

Т.е. при появлении строки, компилятор создает массив константных значений типа const char защищенных от изменений?

И эти строки будут валидными до конца программы? Т.е. можно использовать такую конструкцию как массив константных строк?
505
05 декабря 2007 года
vAC
343 / / 28.02.2006
Цитата: Gigahard
Использование подобных массивов без спецификатора const - не имеет смысла, т.к. записывать в сами строки всеравно не получиться.

Т.е. при появлении строки, компилятор создает массив константных значений типа const char защищенных от изменений?

И эти строки будут валидными до конца программы? Т.е. можно использовать такую конструкцию как массив константных строк?


Не совсем понятно что вы имеете ввиду. Попробую еще раз объяснить.
Все явно указанные строки в программе на этапе компиляции заносятся в сегмент, защищенный от записи. Соответственно никто не сможет ни удалить, не перенести их, отсюда следует что и их адрес также будет все времмя постоянным. Адрес можно интерпретировать как угодно: char*,void *,int,или даже указатель на собственный класс, но только const char * будет отображать сущность этой области памяти.
Создавая подобный массив из char* или const char* вы просто записываете эти заранее определенные адреса в массив и напротяжении всей работы программы они будут действительными.
Сделайте проверку этого факта сами. Создайте в какой-нибудь функции массив на строки. Создайте еще какие-то переменные инициализуемые этими же строками, посмотрите у каждой их адреса. После выхода из функции создайте еще массивы или переменные для тех же строк, опять посмотите на адреса и все станет ясно.

Массив константных строк всегда можно использовать, но только если он инициализируется не явной строкой, то нужно будет обеспечивать ее сохранность.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог