Я бы использовал указатели меньше и использовал бы strdup вместо malloc + strlen + strcpy, вот для чего он нужен.
Лучшее решение - понять, что Emp не подходит для имени, и убедиться, что оно указано при создании. Если вы забудете предоставить имя, оно не будет скомпилировано, вместо того, чтобы вызвать ошибку сегментации при запуске.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char* name;
} Emp;
Emp *create(char * name) {
Emp *emp = (Emp *) malloc(sizeof (Emp));
emp->name = strdup(name);
return emp;
}
void release(Emp* emp) {
free(emp->name);
free(emp);
}
void setName(Emp* emp, char* newName) {
free(emp->name);
emp->name = strdup(newName);
}
char* getName(Emp* emp) {
return emp->name;
}
int main(int argc, char** argv) {
Emp* emp = create("Muhammad Abdullah");
printf("%s", getName(emp));
release(emp);
return (EXIT_SUCCESS);
}