Строковые литералы считаются доступными только для чтения большинством компиляторов, поэтому память, в которой они находятся, может быть помечена как доступная только для чтения, что приводит к ошибке времени выполнения.
Чтобы это работало, выполните следующие действия:
char * f = strdup("abcdef");
strcpy(f, "abcdef");
printf("%s",f);
free(f);
Это создает изменяемую копию строки в памяти кучи, которая, конечно, должна быть освобождена в конце вашей программы.