array - ¿Cuánta memoria asigna int x[10]?
malloc sizeof (2)
En el primer caso, a
sí mismo ocupa bytes de almacenamiento automático sizeof(int *)
, y eso apunta a 10 * sizeof(int)
bytes de almacenamiento dinámico 10 * sizeof(int)
.
En este último caso, b
ocupa 10 * sizeof(int)
bytes de almacenamiento automático. Como b
es una matriz, no hay puntero.
Por lo tanto, el primer caso utiliza más bytes totales, pero menos en la pila (suponiendo que una pila esté en uso para el almacenamiento automático).
Si el número total de bytes que se utilizan es relativamente pequeño, el almacenamiento automático normalmente está bien. Para cantidades mayores, se prefiere el almacenamiento dinámico. En particular, para implementaciones de pila, tener demasiadas variables automáticas que son demasiado grandes puede desbordar la pila.
¿Hay alguna diferencia en el uso de la memoria de estas dos líneas de código?
int *a = malloc( 10 * sizeof(int) );
int b[10];
La primera línea debe asignar memoria para 10 pulgadas y 1 puntero. Pero no estoy seguro de la segunda. ¿Eso también asignará memoria para 10 ints y 1 puntero, o solo 10 ints?
Simplemente pon:
int *a = malloc( 10 * sizeof(int) );
Asigna al menos sizeof(int*)
bytes de almacenamiento automático para el puntero *a
. Cuando se llama a malloc
, esto asignará al menos sizeof(int) * 10
bytes de almacenamiento dinámico para su programa.
Por otra parte:
int b[10];
Asigna al menos sizeof(int) * 10
bytes de almacenamiento automático. No hay punteros aquí. Cuando usa el nombre b
en una expresión (ejemplo: a = b
), se desintegra en un puntero. Pero a
es un puntero y b
es una matriz. Verifique esto en C Preguntas Frecuentes: C-FAQ Sec. 6: matrices y punteros .
En el caso más habitual, "almacenamiento automático" significa la "pila", y "almacenamiento dinámico" significa el "montón". Pero eso no siempre es cierto. Es posible que desee leer un poco de discusiones sobre estos términos en esta pregunta: "¿Por qué los términos" automático "y" dinámico "se prefieren a los términos" pila "y" montón "en la administración de memoria de C ++? .