Чтобы объединить две строки, нужно либо создать новую, достаточно большую, чтобы tp содержал обе исходные строки, либо одна из строк должна быть достаточно большой, чтобы содержать вторую добавленную строку.
Учтите, что строковые литералы неизменны в C (и C ++). Любая попытка изменить строковый литерал приводит к неопределенному поведению.
Вы можете объединять строки, если одна из них хранится в массиве символов.
Например
char str1[12] = "Hello ";
const char *str2 = "World";
strcat( str1, str2 );
puts( str1 );
Или вы можете создать третью строку.
const char *str[2];
str[0] = "Hello ";
str[1] = "World";
char *str1 = malloc( strlen( str[0] ) + strlen( str[1] ) + 1 );
strcpy( str1, str[0] );
strcat( str1, str[1] );
puts( str1 );
free( str1 );