0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
||||||
1 | ||||||
Реализация защиты выхода за границы массива08.12.2014, 21:21. Показов 3615. Ответов 11
Метки нет Все метки)
(
Доброго времени! Прошу помочь разобраться с вопросом возникшим, при изучении C++. Я только начинаю изучать язык и ни как не могу понять вот такой момент. Ниже приведен код перегрузки оператора []. Ни как не могу понять почему если данный оператор вызывается для изменения элемента массива и переменной 'dummy' присваивается значение нулевого байта не второй строкой как в коде а в одной строке вот так: static char dummy = '\0'. Тогда в переменную записывается значение и при выводе это видно. А если реализовано как в примере, она всегда остается нулевой. Буду очень признателен за помощь.
0
|
|
08.12.2014, 21:21 | |
Ответы с готовыми решениями:
11
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
|
58 / 45 / 11
Регистрация: 16.09.2014
Сообщений: 124
|
|
08.12.2014, 21:40 | 2 |
static char dummy; - это объявление и создание переменной, делается один раз.
static char dummy = '\0'; - это объявление и создание переменной и ее инициализация, делается один раз. (на заметку, делать инициализацию - это правильно) dummy = '\0'; - это уже присваивание значения переменной, делается каждый раз при вызове вашего оператора.
0
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
|||||||||||
08.12.2014, 21:49 [ТС] | 3 | ||||||||||
Pancir,
Это я все понимаю, спасибо. Пример клиентского кода где, индекс 100 это выход за пределы массива, если инициализация dymmy происходит в отдельной строке:
Пример клиентского кода где, индекс 100 это выход за пределы массива, если инициализация dymmy происходит одновременно с объявлением т. е вот так static char dummy = '\0' :
0
|
![]() 8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
|
||||||
08.12.2014, 21:56 | 4 | |||||
IvanVladim, в обоих случаях при выходе за диапазон наружу возвращается ссылка на dummy
Но в первом случае оно каждый раз перезаписывается в ноль. А во втором случае не перезаписывается.
0
|
58 / 45 / 11
Регистрация: 16.09.2014
Сообщений: 124
|
|
08.12.2014, 22:02 | 5 |
IvanVladim
Ваш код так и должен работать как вы описываете. Если вам не понятно почему это так работает, читайте внимательнее мое предыдущее сообщения, правда уточнение для 3-й строчки, не каждый вызов оператора, а каждый вызов с "не пройденным" if. Если кратко, то ваш код из первого сообщения работает просто: если выход за границы массива, то ставим dummy - '\0' и возвращаем ссылку на него. если сделать одну строчку static char dummy = '\0'; то код будет работать так: если вышли за пределы, ничего не делать, просто вернуть ссылку на переменную dummy, которая из-за того, что static, хранит предыдущее записанное в нее значение.
0
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
||||||||||||||||||||||||||
08.12.2014, 22:43 [ТС] | 6 | |||||||||||||||||||||||||
hoggy,
Вот этого я и не могу понять. Вот как я понимаю, если не прав поправьте: когда я пишу a[100]='@' я выхожу за границы массива, работает следующий код компилятор видит квадратные скобки и вызывает функцию, которая объявлена в хэдер файле следующим образом:
так как мы вышли за границу массива работают следующие строчки:
Или я не прав? и вызывающий код такого вида:
Что я не так понимаю? Добавлено через 2 минуты И почему
Выводит '@' а
выводит '\0' ???
0
|
![]() 8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
|
||||||
08.12.2014, 23:05 | 7 | |||||
Давайте по шагам:
при этом оно у вас обнуляется, но новое значение никто не выставляет. Вот и получаете ноль.
0
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
|
08.12.2014, 23:12 [ТС] | 8 |
hoggy, Спасибо, теперь дошло, при выводе снова вызывается функция и уже на чтение и ей снова присваивается ноль.
Правильно ли я понимаю, что модификатор static предопределяет создание переменной один раз при запуске программы или при первичном вызове данной функции и при последующих уже не работатет, и если присваивание ноля совместить то при следующем вызове функции эта строка не отрабатывает?
0
|
![]() 8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
|
|||||||||||
08.12.2014, 23:19 | 9 | ||||||||||
Рассмотрим две конструкции:
время жизни до конца программы. То есть, статическая переменная может быть создана только один раз, и её время жизни - до конца программы. Если при этом указать с каким значение нужно создать статическую переменную, то она будет создана только один раз с указанным значением. Теперь рассмотрим статическую локальную переменную:
Но в отличие от обычных статических переменных, локальные инициализируются в момент первого запуска функции. Инициализация может происходить только при создании переменной. Таким образом инициализация локальной статической переменной происходит только один раз при первом вызове функции.
0
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
||||||
08.12.2014, 23:41 [ТС] | 10 | |||||
И после такой инициализации:
0
|
![]() 8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
|
|
08.12.2014, 23:43 | 11 |
0
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
|
08.12.2014, 23:46 [ТС] | 12 |
hoggy, Премного благодарен.
![]()
0
|
08.12.2014, 23:46 | |
Помогаю со студенческими работами здесь
12
Помогите исправить ошибку выхода за границы массива
Ошибка выхода за границы массива, когда её быть не должно Ошибка выхода за границы памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |