example - malloc sizeof en c
arreglo malloced VS. variable-length-array (1)
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
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 puedefree()
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 :-)