No così non puoi, in quel modo il vertore v verrà eliminato appena termina la funzione.
Hai due soluzioni, o crei un vettore dinamico tramite la malloc() o lo crei come static com tutte le problematiche che ne derivano:
char* ciao1()
{
char* v = malloc(80);
strcpy(v,"ciao mondo");
return v;
}
char* ciao2()
{
static char v[80];
strcpy(v,"ciao mondo");
return v;
}
int main()
{
char* v = ciao1();
printf("%s\n",v);
free(v);
v = ciao2();
printf("%s\n",v);
return 0;
}
Ripeto che se non per particolari esigenze è da preferire la prima soluzione, quella con void o in alternativa int in modo da ritornare un errore se necessario.