Вы получаете ошибку сегмента, потому что
struct emp e1={"David",23};
«Дэвид» находится в данных, поэтому это строка только для чтения, или const.
Когда вы
strupr(e2.n);
Вы пытаетесь изменить ту же самую константную строку.
Рабочий код:
struct emp e2;
e2.age = e1.age;
e2.n = (char *)malloc(SOME_SIZE);
strcpy(e2.n, e1.n); //here you copy the contents of the read-only string to newly allocated memory
strupr(e2.n);
printf(...);
free(e2.n);
return 0;