char s1[]="Hello";
char s2[]="World";
strcat(s1,s2);
Объявления переменных выделяют память для 5 символов каждый плюс завершающий байт NUL. Ваш strcat
вызов записывает после этого пробела, что приводит к неопределенным результатам.
В этом случае схема памяти, вероятно, выглядит примерно так
0 1 2 3 4 5 6 7 8 9 10 11
H e l l o \0 W o r l d \0
^ ^
s1 s2
После strcat
результат будет:
0 1 2 3 4 5 6 7 8 9 10 11
H e l l o W o r l d \0 \0
^ ^
s1 s2
Что дает результат, который вы видите. Обратите внимание, что могут быть и другие возможные результаты, программа может, например, сбой при strcat
звонке.