Вы ошибаетесь.
Компилятор неявно настраивает параметр, объявленный как массив, для указания на тип элемента массива.
Таким образом, это объявление
void show(char text[2]);
эквивалентно объявлению
void show(char *text );
Вы можете даже объявить функцию как
void show(char text[1000]);
В любом случае компилятор подгонит ее под объявление
void show(char *text );
. является функцией, имеющей дело с указателем на первый элемент массива, переданный функции в качестве аргумента, или со значением переданного указателя в качестве аргумента.
Таким образом, переполнение не происходит. Сам строковый литерал не перемещается из одной части памяти в другую. Это значение указателя, которое передается в функцию.
Вы несете ответственность за то, чтобы не получить доступ к переданной строке за ее пределами выделенной памяти.