|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
||||||
Реализация защиты выхода за границы массива08.12.2014, 21:21. Показов 4177. Ответов 11
Метки нет (Все метки)
Доброго времени! Прошу помочь разобраться с вопросом возникшим, при изучении C++. Я только начинаю изучать язык и ни как не могу понять вот такой момент. Ниже приведен код перегрузки оператора []. Ни как не могу понять почему если данный оператор вызывается для изменения элемента массива и переменной 'dummy' присваивается значение нулевого байта не второй строкой как в коде а в одной строке вот так: static char dummy = '\0'. Тогда в переменную записывается значение и при выводе это видно. А если реализовано как в примере, она всегда остается нулевой. Буду очень признателен за помощь.
0
|
||||||
| 08.12.2014, 21:21 | |
|
Ответы с готовыми решениями:
11
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива |
|
59 / 46 / 11
Регистрация: 16.09.2014
Сообщений: 124
|
|
| 08.12.2014, 21:40 | |
|
static char dummy; - это объявление и создание переменной, делается один раз.
static char dummy = '\0'; - это объявление и создание переменной и ее инициализация, делается один раз. (на заметку, делать инициализацию - это правильно) dummy = '\0'; - это уже присваивание значения переменной, делается каждый раз при вызове вашего оператора.
0
|
|
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
|||||||||||
| 08.12.2014, 21:49 [ТС] | |||||||||||
|
Pancir,
Это я все понимаю, спасибо. Пример клиентского кода где, индекс 100 это выход за пределы массива, если инициализация dymmy происходит в отдельной строке:
Пример клиентского кода где, индекс 100 это выход за пределы массива, если инициализация dymmy происходит одновременно с объявлением т. е вот так static char dummy = '\0' :
0
|
|||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 08.12.2014, 21:56 | ||||||
|
IvanVladim, в обоих случаях при выходе за диапазон наружу возвращается ссылка на dummy
Но в первом случае оно каждый раз перезаписывается в ноль. А во втором случае не перезаписывается.
0
|
||||||
|
59 / 46 / 11
Регистрация: 16.09.2014
Сообщений: 124
|
|
| 08.12.2014, 22:02 | |
|
IvanVladim
Ваш код так и должен работать как вы описываете. Если вам не понятно почему это так работает, читайте внимательнее мое предыдущее сообщения, правда уточнение для 3-й строчки, не каждый вызов оператора, а каждый вызов с "не пройденным" if. Если кратко, то ваш код из первого сообщения работает просто: если выход за границы массива, то ставим dummy - '\0' и возвращаем ссылку на него. если сделать одну строчку static char dummy = '\0'; то код будет работать так: если вышли за пределы, ничего не делать, просто вернуть ссылку на переменную dummy, которая из-за того, что static, хранит предыдущее записанное в нее значение.
0
|
|
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
||||||||||||||||||||||||||
| 08.12.2014, 22:43 [ТС] | ||||||||||||||||||||||||||
|
hoggy,
Вот этого я и не могу понять. Вот как я понимаю, если не прав поправьте: когда я пишу a[100]='@' я выхожу за границы массива, работает следующий код компилятор видит квадратные скобки и вызывает функцию, которая объявлена в хэдер файле следующим образом:
так как мы вышли за границу массива работают следующие строчки:
Или я не прав? и вызывающий код такого вида:
Что я не так понимаю? Добавлено через 2 минуты И почему
Выводит '@' а
выводит '\0' ???
0
|
||||||||||||||||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 08.12.2014, 23:05 | |||||||
при этом оно у вас обнуляется, но новое значение никто не выставляет. Вот и получаете ноль.
0
|
|||||||
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
|
| 08.12.2014, 23:12 [ТС] | |
|
hoggy, Спасибо, теперь дошло, при выводе снова вызывается функция и уже на чтение и ей снова присваивается ноль.
Правильно ли я понимаю, что модификатор static предопределяет создание переменной один раз при запуске программы или при первичном вызове данной функции и при последующих уже не работатет, и если присваивание ноля совместить то при следующем вызове функции эта строка не отрабатывает?
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 08.12.2014, 23:19 | ||||||||||||
время жизни до конца программы. То есть, статическая переменная может быть создана только один раз, и её время жизни - до конца программы. Если при этом указать с каким значение нужно создать статическую переменную, то она будет создана только один раз с указанным значением. Теперь рассмотрим статическую локальную переменную:
Но в отличие от обычных статических переменных, локальные инициализируются в момент первого запуска функции. Инициализация может происходить только при создании переменной. Таким образом инициализация локальной статической переменной происходит только один раз при первом вызове функции.
0
|
||||||||||||
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
|||||||
| 08.12.2014, 23:41 [ТС] | |||||||
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 08.12.2014, 23:43 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
|
| 08.12.2014, 23:46 [ТС] | |
|
hoggy, Премного благодарен.
0
|
|
| 08.12.2014, 23:46 | |
|
Помогаю со студенческими работами здесь
12
Помогите исправить ошибку выхода за границы массива
Ошибка выхода за границы массива, когда её быть не должно Ошибка выхода за границы памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|