arreglo malloced VS. variable-length-array

Hay dos formas de asignar memoria a una matriz, cuyo tamaño se desconoce al principio. La forma más común es usar malloc esta manera.

 int * array; ... // when we know the size array = malloc(size*sizeof(int)); 

Pero también es válido en C99 para definir la matriz después de que sepamos el tamaño.

 ... // when we know the size int array[size]; 

¿Son absolutamente iguales?

No, no son absolutamente iguales. Si bien ambos le permiten almacenar el mismo número y tipo de objetos, tenga en cuenta que:

  • Puede free() una matriz malloced, pero no puede free() una matriz de longitud variable (aunque está fuera del scope y deja de existir una vez que se deja el bloque adjunto). En la jerga técnica, tienen una duración de almacenamiento diferente: asignada para malloc frente a automática para arreglos de longitud variable.
  • Aunque C no tiene un concepto de stack , muchas implementaciones asignan una matriz de longitud variable desde la stack, mientras que malloc asigna desde la stack . Este es un problema en los sistemas de stack limitada, por ejemplo, muchos sistemas operativos integrados, donde el tamaño de stack es del orden de kB, mientras que el montón es mucho más grande.
  • También es más fácil probar una asignación fallida con malloc que con una matriz de longitud variable.
  • la memoria malloced se puede cambiar de tamaño con realloc() , mientras que los VLA no pueden (más precisamente, ejecutando el bloque nuevamente con una dimensión de matriz diferente, lo que pierde el contenido anterior).
  • Una implementación de C89 alojada solo es compatible con malloc() .
  • Es posible que una implementación C11 alojada no admita matrices de longitud variable (luego debe definir __STDC_NO_VLA__ como el número entero 1 según C11 6.10.8.3).
  • Todo lo demás que me he perdido 🙂