В этом коде есть несколько проблем:
1 - вызов strlen для цикла for - плохая идея, он будет вычислять длину строки на каждой итерации, поэтому лучше вызывать его один раз перед циклом и сохранять результат в переменной.
2 - та же самая проблема strlen применяется к strlen (path_cmp1) внутри цикла, вызывает его перед циклом и увеличивает его размер.
В конце концов, лучше просто скопировать обе строки и сохранить их в динамически распределенной строке, например:
char *join_strings(const char* s1, const char* s2)
{
size_t lens1 = strlen(s1);
size_t lens2 = strlen(s2);
//plus 1 for \0
char *result = malloc(lens1 + lens2 + 1);
if(result)
{
memcpy(result, s1, lens1);
memcpy(result+lens1, s2, lens2+1);
}
//do not forget to call free when do not need it anymore
return result;
}