Чем опасен выход за границы массива?

162
20 июня 2019, 03:30

Можно ли оставлять выход за границы массива в программах? Чем это грозит? Что происходит при выходе за его границы?

Answer 1

В современных операционных системах память каждого процесса существует отдельно от других процессов. Программа не может просто так получить доступ к памяти чужого процесса. Проверка осуществляется операционной системой, причём поддержка этого реализована аппаратно в современных процессорах. Это сделано для защиты, чтобы неправильно работающая программа не могла нарушить работу других.

Представим память следующим образом:

|___память_вашей_программы___массив|___память_чужой_программы___|

В данном случае массив расположен в конце области памяти вашей программы. Если произойдёт выход за границу массива, то получится обращение к области памяти чужой программы. Операционная система этого не позволит, произойдёт исключение.

А что если массив расположен так:

|___сегмент_данных___массив\сегмент_кода___|

В каждой программе есть сегмент(ы) кода и сегмент(ы) данных. На уровне операционной системы разным сегментам разрешены разные действия: чтение, запись, исполнение. Это, опять-таки, сделано для обеспечения надёжности. В сегмент кода запись запрещена. Соответственно, и в данном случае, если произойдёт обращение за пределами массива, тоже будет выброшено исключение.

Третий вариант:

|___сегмент_данных___массив___сегмент_данных___|

В этом случае выход за пределы массивы не приведёт к исключению, операционная система не может отследить его своими силами, т. к. процесс имеет полное право писать в свой сегмент данных. Просто при этом будут либо прочитаны данные, не относящиеся к массиву, либо повреждены (переписаны) эти данные.

READ ALSO
Найти по атрибуту и тегу атрибута данные внутри этого тега

Найти по атрибуту и тегу атрибута данные внутри этого тега

Пришлось полностью восстанавливать пример, у вас не хватаетgetNodeValue()

148
Работа с GridBagLayout()

Работа с GridBagLayout()

Подскажите пожалуйстаИмеется панель:

106
Label.getHeight возвращает 0, а Label.getPrefHeight возвращает -1

Label.getHeight возвращает 0, а Label.getPrefHeight возвращает -1

Не могу получить высоту лейбла

133