Проблема состоит в том, что C/C++ на самом деле не делает никакой граничной проверки относительно массивов. Это зависит от ОС, чтобы гарантировать доступ к допустимой памяти.
В данном случае, Вы объявляете основанный на стеке массив. В зависимости от конкретной реализации, получая доступ вне границ измерения массива просто получит доступ к другой части уже выделенного стекового пространства (большая часть ОС, и потоки резервируют определенную часть памяти для стека). Пока Вы просто, оказывается, играете вокруг в предварительно выделенном стековом пространстве, все не откажет (обратите внимание, что я не сказал что работа).
то, Что происходит на последней строке, - то, что Вы теперь получили доступ вне части памяти, которая выделяется для стека. В результате Вы индексируете в часть памяти, которая не выделяется Вашему процессу или выделяется способом только для чтения. ОС видит это и отправляет отказ seg в процесс.
Это - одна из причин, что C/C++ так опасен когда дело доходит до граничной проверки.
window.onbeforeunload = function (e) {
var message = "Your confirmation message goes here.",
e = e || window.event;
// For IE and Firefox
if (e) {
e.returnValue = message;
}
// For Safari
return message;
};
Обратите внимание: большинство браузеров помещают это сообщение после другого текста. У вас нет полного контроля над содержанием диалогового окна подтверждения.
Нет, стандартного из браузера не обойтись. Все, что вы можете сделать, это вставить в него произвольный текст; если вы используете следующий обработчик событий (зарегистрировал способ библиотеки прототипа):
Event.observe(window, "beforeunload", function(event) {
if (showMyBeforeUnloadConfirmation)
event.returnValue = "foo bar baz";
});
(и showMyBeforeUnloadConfirmation
истинно), вы получите стандартное подтверждение браузера со следующим текстом:
Вы уверены, что хотите уйти с этой страницы?
foo bar baz
Нажмите OK, чтобы продолжить, или Отмена, чтобы остаться на текущей странице.
[OK] [Отмена]