В этом контексте манипуляции с памятью вам важно понять, что вы на самом деле делаете, когда объявляете это динамическое выделение памяти.
Ваш указатель «массива» находится в стекеи указывает на первый элемент (первые 4 байта) непрерывного блока памяти (12 байтов (3xsizeof (int))), который находится НА КАРТЕ.
Когда вы пытаетесь получить доступ к этой памяти пространства кучи,с помощью оператора [N] вы просите компилятор выполнить некоторую арифметику указателей, чтобы позволить вам получить доступ к данным, содержащимся в памяти, в месте (массив + (N) * sizeof (int)) НА ГОЛОВЕ.
Поэтому, когда вы пытаетесь получить доступ к массиву [3], вы пытаетесь получить доступ к 4-байтовой ячейке памяти, которая расположена непосредственно после последней области памяти, выделенной для вашего массива, это может быть много вещей, включая ваши собственные данные изпредыдущее распределение!
Как отмечалось в других ответах на этот пост, это неопределенное поведение, и его следует избегать, так какВы не можете контролировать, какими данными вы манипулируете, когда получаете доступ к данным «за пределами».