strcat () не выделяет новую строку, он добавляет вторую вторую строку .sorted к первой. Возвращаемое значение strcat () будет тем же строковым указателем, что и первый строковый параметр. Ваше использование strcat () наиболее вероятно повредило память, записав за конец mydata-> fname.
См. Код ниже для примера того, как выделить новую строку для final_file.
#define FILE_SORTED_EXT ".sorted"
void *threads_sorting (void *arg) {
struct args_sort *mydata;
mydata = (struct args_sort *) arg;
FILE *forig
char *file_name;
char *final_name;
file_name = mydata->fname;
printf ("File Name: %s\n", file_name);
// Allocate space for "sorted" file_name.
final_name = malloc(strlen(file_name) + strlen(FILE_SORTED_EXT) + 1);
// append .sorted extentsion to file name.
strcpy(final_name, file_name);
strcat(final_name, FILE_SORTED_EXT);
printf ("File Name: %s\n", file_name);
printf ("FInal Name: %s\n", final_name);
forig = fopen(file_name,"r");
if(forig==NULL)
{
free(final_name); // make sure to cleanup allocated memory.
perror("threads_sorting(): Unable to open file\n");
exit(1);
}
// TODO: do something with forig FD and final_name.
free(final_name); // make sure to cleanup allocated memory.
}//end of function