La forma "correcta" sería:
Código:
char *mid2 (char *str1, int pos, int uds)
{
char str2[uds];
int z;
for (z=pos;z<=pos+uds-1;z++)
str2[z-pos]=str1[z];
return str2;
}
El problema con eso es que estarías retornando un puntero a algo que ya no existe, porque cuando salgas del ámbito de la función str2 ya no existirá.
Te recomiendo que leas un manual de punteros y cadenas de caracteres, en google hay mucha info al respecto y si no me equivoco en las FAQs del foro también hay algo al respecto.
Saludos