¿Por qué hay una necesidad de matrices dinámicas si tenemos matrices de longitud variable?

Bueno, la razón es bastante simple.

Las matrices de longitud variable siguen la asignación automática de memoria (Ama por simplicidad). Aquí, la vida útil de su variable solo dura hasta que el programa esté dentro del alcance de la variable.

Por ejemplo, mira el siguiente código.

void automaticExample (int v)
{
int arr [v];
// Haz cosas relevantes
}

Ahora la memoria asignada por int arr [v] permanece accesible solo hasta que su programa esté en la función ‘automaticExample’. Después de eso, se vuelve inaccesible. La vida útil de la variable no está bajo su control y dura tanto como el alcance.

Ahora veamos la asignación dinámica de memoria.

int * dynamicExample (int v)
{
int * p = (int *) malloc (v * sizeof (int));
// Haz cosas relevantes
volver p;
}

int * ptr = dynamicExample (); // Aún accesible

Entonces, aquí, puede acceder a la memoria asignada incluso cuando su programa está fuera del alcance de donde fue declarado.

Ahora se puede acceder a este trozo de memoria siempre que no se encuentre una declaración libre.

libre (ptr);

Por lo tanto, la asignación dinámica de memoria le permite un mayor acceso a la memoria, en comparación con la asignación automática de memoria, o lo que usted denomina matriz de longitud variable.

La matriz de longitud variable es una estructura de matriz fija, que debe definir de antemano en su programa. Piense que mientras su programa se está ejecutando, entonces necesita asignar un espacio de memoria para el cual ya ha definido una matriz de longitud fija. Si el tamaño requerido es más de lo que ha declarado, recibirá un error. Es por eso que se requiere una matriz dinámica. Depende completamente de cómo realmente quiere que se comporte su programa.