matriz malloced VS. variable-length-array [duplicado]


Esta pregunta ya tiene una respuesta aquí:

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 así

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

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

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

¿Son absolutamente los mismos?

1 answers

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() un array malloced, pero no puede free() un array de longitud variable (aunque sale del ámbito y deja de existir una vez que se deja el bloque que lo encierra). En la jerga técnica, tienen diferente duración de almacenamiento: asignado para malloc versus automático para matrices de longitud variable.
  • Aunque C no tiene concepto de pila , muchas implementaciones asignan un array de longitud variable desde la pila, mientras que malloc asigna desde el montón . Este es un problema en los sistemas con pila limitada, por ejemplo, muchos sistemas operativos embebidos, donde el tamaño de la 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 las VLAs no pueden (más precisamente solo ejecutando el bloque de nuevo con una dimensión de matriz diferente which que pierde el contenido anterior).
  • Una implementación alojada de C89 solo admite malloc().
  • Una implementación alojada de C11 puede no soportar matrices de longitud variable (entonces debe definir __STDC_NO_VLA__ como el entero 1 de acuerdo con C11 6.10.8.3).
  • Todo lo demás me he perdido: -)
 33
Author: Jens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-21 15:07:12