У вас память накладывается.
Условно до вызова функции память выглядит так:
Ivan \0Golubkov\0
А после:
Ivan Golubkovv\0
Посмотрите, что творится с переменной surname и убедитесь
Чтобы это исправить надо либо для name выделять заранее память побольше, либо при склеивании выделять новую память и возвращать на неё указатель.
PS: Если не играться в "кто меньше строк напишет", то вот так будет гораздо понятнее:
void append_str(char* first, char* second) {
char* end_of_first = first;
while(*end_of_first != '\0') {
end_of_first++;
}
char* current = second;
while(*current != '\0') {
*end_of_first = *current;
end_of_first++;
current++;
}
*end_of_first = '\0'; // Самое важное
}