Вы должны подумать, как ваша «строка» на самом деле представлена в памяти.В C строки - это буферы выделенной памяти, оканчивающиеся байтом 0.
filename |p|i|c|t|u|r|e|0|
directory |/|r|d|/|0|
Требуется новое пространство памяти для копирования содержимого памяти обеих строк вместе и последнего 0 байтов.
path |p|i|c|t|u|r|e|/|r|d|/|0|
Что дает этот код:
int lenFilename = strlen(filename); // 7
int lenDirectory = strlen(directory); // 4
int lenPath = lenFilename + lenDirectory; // 11 I can count
char* path = malloc(lenPath + 1);
memcpy(path, filename, lenFilename);
memcpy(path + lenFilename, directory, lenDirectory);
path[lenPath] = 0; // Never EVER forget the terminating 0 !
...
free(path); // You should not forget to free allocated memory when you are done
(В этом коде может быть ошибка off-by-1, фактически она не проверена ... Сейчас 01:00 и янадо идти спать!)