@loopunrolling: siccome si tratta di un esercizio non ho voluto dare la risposta ma solo dare dei suggerimenti al nostro amico per trovarla.
Comunque, per fine educativo, anche se in questo forum mi è stato già dato del pignolo , io suggerirei al professore di modificare la chiamata così
int main(int argc, char **argv)
{
char d[9999];
char *p;
sprintf(d,"d=%d",argc);
p = f(d);
if( p ) // <- verifica che l'allocazione ha avuto successo
{
printf("%s",p);
free(p); // <- deallocazione
}
}
e anche la funzione f() andrebbe modificata
char* f(char *d)
{
char *ret;
ret=(char *)malloc(strlen(d)+1);
if( ret ) // <- verifica che l'allocazione ha avuto successo
strcpy(ret,d);
return ret;
}