pointer example array c malloc variable-length-array

example - malloc sizeof en c



arreglo malloced VS. variable-length-array (1)

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 (a pesar de que queda fuera del alcance 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 pila , muchas implementaciones asignan una matriz de longitud variable de la pila, mientras que malloc asigna desde la pila . Este es un problema en los sistemas de pila limitada, por ejemplo, muchos sistemas operativos integrados, donde el tamaño de pila 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 de C11 alojada no admita matrices de longitud variable (luego debe definir __STDC_NO_VLA__ como el número entero 1 de acuerdo con C11 6.10.8.3).
  • Todo lo demás que me he perdido :-)