Тут ты переходиш область отведенную под переменную. В Дебаг режиме это фиксируется и при выходе из программы выдается сообшение об этом.
Давай разберемся:
char str1[]="HELLO",str2[]="WORLD!";
В такой записе под переменную компилятор отводит ровно то количество байт, которое указано при иницилизации. Т.е. "HELLO" будет занимать 6 байт. Получается,что компилятор под переменную str1 будет отводить 6 байт.
В своей функции ты добавляеш еше 5 байт. Т.е. переходиш область, отведенную компилятором под переменную.
Если ты например сделаеш так,
char str1[25]="HELLO",str2[25]="WORLD!";
То я думаю, программа не должна выскакивать с ошибкой в данном случае.