strdup
делает копию данного массива символов. Он только выделяет достаточно памяти для хранения этой строки. Вы не можете strcat
ничего с ним сделать, так как это выходит за пределы и происходит неопределенное поведение.
Вам нужно выделить достаточно памяти для всей строки, затем strcpy
первой части и strcat
последней. Только так определяется поведение.
Например:
char path[256];
strcpy(path, argv[1]);
strcat(path,"/mynewfile.txt");
FILE *f=fopen(path,"w");
Обратите внимание, что вы все равно должны убедиться, что выделенной памяти достаточно.