matriz malloced VS. variable-length-array [duplicado]
Esta pregunta ya tiene una respuesta aquí:
- ¿Cuál es la diferencia entre un VLA y la asignación de memoria dinámica a través de malloc? 4 respuestas
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?
23
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功, 2013-05-21
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 puedefree()
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
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