|
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 6
|
||||||
Реализация защиты выхода за границы массива08.12.2014, 21:21. Показов 4152. Ответов 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
Помогите исправить ошибку выхода за границы массива
Ошибка выхода за границы массива, когда её быть не должно Ошибка выхода за границы памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во
всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
|