Una última cosilla....
No olvides nunca LIBERAR la memoria reservada dinámicamente. Aunque en teoría el sistema libera la memoria que has reservado cuando el programa termina, es una buena costumbre liberar siempre la memoria reservada cuando ya no te sirva (aunque sea un programa de prueba).
Imagina que el ejemplo que has puesto es una función que pide los datos, y al terminar los guarda en un fichero. Si no liberas la memoria cuando ya no la necesitas, tu función se convertirá en un "gusano" que irá comiendo memoria sin parar. Al final, el programa podría fallar en otro lado por falta de memoria. Estas fugas de memoria son muy difíciles de encontrar, y son más habituales de lo que puedas creer.
De hecho, en linux hay multitud de herramientas para detectar estas fugas de memoria, como dmalloc, electric-fence, memprof, memwatch, etc.
Esto no quiere decir que no la utilices, si no que mantengas cierta disciplina cuando trabajes con punteros dinámicos.
Yo la utilizo para casi todo, de forma que no tienes que implantar límites artificiales, ni desperdiciarás memoria que no utilices (por ejemplo declarando arrays muy grandes).
Si tomas las debidas precauciones cuando trabajes con la memoria dinámica, no tendrás que pasar horas depurando un programa que aparentemente es correcto. Te lo digo por experiencia...