Насколько опасен доступ к массиву за пределами его границ (в C)? Иногда бывает, что я читаю из-за пределов массива (теперь я понимаю, что я потом обращаюсь к памяти, используемой некоторыми другими частями моей программы или даже за ее пределами), или я пытаюсь установить значение для индекса за пределами массива. Программа иногда вылетает, но иногда просто запускается, давая неожиданные результаты.
Теперь, что я хотел бы знать, насколько опасно это на самом деле? Если это наносит ущерб моей программе, это не так уж плохо. Если, с другой стороны, это нарушает что-то вне моей программы, потому что мне каким-то образом удалось получить доступ к какой-то совершенно несвязанной памяти, тогда я думаю, что это очень плохо. Я читал много "что-нибудь может случиться", "сегментация может быть наименее плохой проблемой", "ваш жесткий диск может стать розовым, а единороги могут петь под вашим окном", что все хорошо, но что на самом деле представляет опасность?
Мои вопросы:
- Может ли считывание значений из-за пределов массива повреждать что-либо отдельно от моей программы? Я бы предположил, что просто смотреть на вещи ничего не меняет, или, например, изменит атрибут "последний раз открыт" файла, к которому я попал?
- Можете ли выставлять значения вне вне массива, что-то кроме моей программы? Из этого вопроса о переполнении стека я понимаю, что можно получить доступ к любой ячейке памяти, что нет гарантии безопасности.
- Теперь я запускаю свои небольшие программы из XCode. Оказывает ли это некоторую дополнительную защиту вокруг моей программы, где она не может выйти за пределы собственной памяти? Может ли это нанести вред XCode?
- Любые рекомендации о том, как безопасно запускать свой код с ошибкой?
Я использую OSX 10.7, Xcode 4.6.