Можно ли оставлять выход за границы массива в программах? Чем это грозит? Что происходит при выходе за его границы?
В современных операционных системах память каждого процесса существует отдельно от других процессов. Программа не может просто так получить доступ к памяти чужого процесса. Проверка осуществляется операционной системой, причём поддержка этого реализована аппаратно в современных процессорах. Это сделано для защиты, чтобы неправильно работающая программа не могла нарушить работу других.
Представим память следующим образом:
|___память_вашей_программы___массив|___память_чужой_программы___|
В данном случае массив расположен в конце области памяти вашей программы. Если произойдёт выход за границу массива, то получится обращение к области памяти чужой программы. Операционная система этого не позволит, произойдёт исключение.
А что если массив расположен так:
|___сегмент_данных___массив\сегмент_кода___|
В каждой программе есть сегмент(ы) кода и сегмент(ы) данных. На уровне операционной системы разным сегментам разрешены разные действия: чтение, запись, исполнение. Это, опять-таки, сделано для обеспечения надёжности. В сегмент кода запись запрещена. Соответственно, и в данном случае, если произойдёт обращение за пределами массива, тоже будет выброшено исключение.
Третий вариант:
|___сегмент_данных___массив___сегмент_данных___|
В этом случае выход за пределы массивы не приведёт к исключению, операционная система не может отследить его своими силами, т. к. процесс имеет полное право писать в свой сегмент данных. Просто при этом будут либо прочитаны данные, не относящиеся к массиву, либо повреждены (переписаны) эти данные.
Пришлось полностью восстанавливать пример, у вас не хватаетgetNodeValue()
Не могу получить высоту лейбла