Hai fatto cinque grossi errori:
1. new char (strlen(parola)) è sbagliato, questo alloca un singolo char e lo inizializza con strlen(parola) (convertito in un char); nel codice che segue quindi stai sforando abbondantemente dal buffer allocato (cosa che può essere apparentemente indolore, come in questo caso, o portare a crash casuali); quello che intendevi scrivere è new char [strlen(parola)];
2. ... ma è comunque sbagliato, devi prevedere un carattere in più per il carattere '\0' finale; quindi dovrà essere new char[strlen(parola)+1];
3. in fun1 non termini la stringa "ritorno" con il '\0', motivo per cui in debug vedi più caratteri di quanti ce ne siano: il debugger va avanti a leggere finché non trova un '\0' che per caso si trova lì.
4. Nel main non deallochi la memoria restituita da fun1;
5. Mai usare la gets, l'utente può inserire quanti caratteri gli pare e sforare dal tuo buffer; piuttosto, fgets.
Un abbozzo di correzione potrebbe essere:
codice:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
char* fun1(char parola[]);
int main()
{
char frase[10];
char *p;
printf("Inserisci la frase ");
fgets(frase, sizeof(frase), stdin);
// fgets acquisisce anche il newline finale, rimuovilo se credi
p = fun1(frase);
delete[] p;
return 0;
}
char* fun1(char parola[])
{
int i;
char* ritorno=new char[strlen(parola)+1];
for (i = 0;parola[i]!='\0';i++)
if ((parola[i]>='a') && (parola[i]<='z'))
ritorno[i]=parola[i]-(char) 32;
else
ritorno[i] = '*';
ritorno[i]=0;
return ritorno;
}