Ответы @valtah и @NPE верны. Если вы посмотрите еще более подробно о том, что это происходит вы можете понять, почему:
Если мы посмотрим на кадр стека (или запись активации) для этого исполнения:
----------------------------------------------------------
SP| saved state | return address | a | b | p |
-----------------------------------------------------|----
^ |
| |
.-------------'
&a
Вы увидите, что & в является адресом, где a
хранится в стеке, и это также назначается p
. Когда вы используете значение (p-1), оно может вычислять позицию в другом месте в стеке. (Хороший компилятор знал бы, что это не указатель массива и дает семантическую ошибку на этом этапе.) Многие компиляторы просто вычислили адрес. Когда вы присваиваете ему значение, возможно, что вы меняете значение одного элемента вдали от адреса a
. Это может быть b
, или это может быть Обратный адрес. Затем это изменяет состояние выполнения программы.
Это именно тот механизм, в котором используются атаки на инъекции кода для управления системами. Это код нарушения безопасности.
Теперь вопрос приходит на ум. Откуда появился этот код? Вы пишете его или читаете где-то. Это, безусловно, говорит специалистам о том, какой код вы работаете с ...
:-)
'* (п-1) = 100;' вызывает неопределенное поведение, – ouah
Что этот код должен делать, в своем уме? –