Invece che allocare un nuovo elemento e poi associarlo a quello che vuoi realmente allocare, prova ad allocare il diretto interessato, così:
codice:
/* Crea elementi successivi */
hello *aggiungi(hello *p, int ins)
{
	if (p == NULL) {
		p = malloc(sizeof(hello));
		p->n = ins;
		p->next = NULL;
	}
	else {
		aggiungi(p->next, ins);
	}
	return p;
}

PS: Non so se questo risolverà l'errore, ma dovrebbe fargli risparmiare dei cicli di cpu inutili nel caso che passi alla funzione un puntatore già allocato, e dovrebbe migliorare il codice...

PS2: Scusa... Ma se gli passi un'oggetto di tipo hello già allocato questa funzione ti restituisce lo stesso oggetto, e non quello che allochi... L'errore potrebbe dipendere proprio da questo se richiami la funzione ogni volta con un puntatore all'oggetto invece che con un puntatore al membro next dell'oggetto...
Se vuoi evitare ciò devi mettere un:
codice:
p = aggiungi(p->next, ins);
nell'else