El malloc sirve para utilizar memoria dinámica. Para todo lo que se necesite memoria dinámica, es útil (en C, en C++ suele usarse new).
En el caso que dices de los vectores, tu solución no es demasiado buena. Dices de darle un tamaño fijo al vector, y no utilizandolo todo. Pero, ¿qué tamaño le das? Tiene que ser lo suficientemente grande como para no necesitar más. Por lo tanto, tu programa estará almacenando un vector muy grande (para los casos peores), cuando en realidad utilizas siempre pocas posiciones de ese vector.
Hacerlo con malloc no te permite reservar una posición cada vez que lo necesites (si estamos hablando de vectores o arrays, y no de listas enlazadas, otra utilidad de la memoria dinámica). Sin embargo, con malloc puedes definir un vector de un tamaño _no conocido en tiempo de compilación_.
Por ejemplo, vamos a cargar en un vector de caracteres un fichero de texto. A la hora de escribir el programa, no sabemos de qué tamaño podemos necesitar el vector. En la solución que dices tú, declaramos por ejemplo, un vector de 1Mb, confiando en que nunca intentemos cargar ficheros más largos. Sin embargo, muchas veces cargaremos ficheros de unos pocos Kb's, desaprovechando mucha memoria; además en el caso de intentar cargar uno más grande, no podremos.
Con malloc, primero averiguamos el tamaño del fichero, después pedimos la memoria justa que se necesita, y cargamos en ella el fichero.
Espero que hayas cogido la idea!