Позвольте привести аналогию с тем, почему это "работает".
Предположим, вам нужно нарисовать рисунок, чтобы вы достали лист бумаги, положили его на стол и начали рисовать.
К сожалению, бумага недостаточно велика, но вы, не заботясь или не замечая, просто продолжаете рисовать свой рисунок.
Когда вы закончите, вы сделаете шаг назад и посмотрите на свой рисунок, и он выглядит хорошо, именно так, как вы и предполагали, и именно так, как вы его нарисовали.
Пока кто-нибудь не придет и не возьмет лист бумаги, который они оставили на столе, прежде чем вы дойдете до него.
Теперь часть рисунка отсутствует. Часть, которую вы нарисовали на бумаге другого человека.
Кроме того, у этого человека теперь есть кусочки вашего рисунка на его бумаге, возможно, он возится с тем, что он хотел вместо этого на бумаге.
Так что, хотя использование вашей памяти может работать, это происходит только потому, что ваша программа завершает работу. Оставьте такую ошибку в программе, которая работает некоторое время, и я могу гарантировать вам, что вы получите странные результаты, сбои и еще много чего.
C построен как бензопила на стероидах. Вы почти ничего не можете сделать. Это также означает, что вам нужно знать, что вы делаете, иначе вы увидите прямо сквозь дерево и в ногу, прежде чем узнаете его.