sizeof(arr)
байтов сохранено * (плюс любой отступ, который компилятор захочет обойти, хотя это не для массива как такового). В реализации со стеком это просто означает перемещение указателя стека sizeof(arr)
байтов вниз. (Вот откуда берется хранилище. Именно поэтому автоматическое распределение выполняется быстро.)
'\0'
не размещается. Если вы скопируете в него «abcd», вы получите переполнение буфера, потому что это занимает всего 5 байт, но у вас есть только 4. Вы вводите землю неопределенного поведения, и все может произойти.
На практике вы рано или поздно повредите стек и аварийно завершите работу, или испытаете то, что сделали, и перезапишите близлежащие переменные (потому что они тоже размещены так же, как массив). Но никто не может сказать наверняка, что происходит, потому что это не определено.
* Что является sizeof(char) * 4
. sizeof(char)
равно всегда 1, поэтому 4 байта.