La llamada a malloc
, o bien tener éxito en la devolución de un bloque contiguo lógicamente de la memoria del espacio de memoria de almacenamiento dinámico de su programa igual al tamaño solicitado o se producirá un error con un puntero NULL. "Lógicamente contigua" significa que con un malloc
de este tipo:
int *ip; /* Nothing yet allocated (other than the size of a pointer... */
int ar[100]; /* 100 ints on the STACK */
ip = (int *)malloc(sizeof ar); /* if that succeeds, 100 ints on the HEAP */
asignará espacio para 100 enteros de su sistema operativo en el montón y devolver NULL o el puntero. Por separado, el arreglo ar
se asigna en la PILA. Cada matriz se distribuirá con todas las entradas lógicamente una al lado de la otra, al menos hasta donde sabe su programa. Si no estuvieran uno al lado del otro, no sería posible direccionar estos bloques como matrices con la notación array[offset]
o con la aritmética del puntero.
A continuación, puede acceder a cualquiera PILA o montón bloques de memoria con un acceso a la matriz o el acceso puntero indistintamente como esto:
ip[2]=22; /* the second element of ip[] is '22' */
*(ar+33)=3333; /* the 33 element of ar is '3333' */
i=*(ip+2); /* assign using pointers */
j=ar[33]; /* assign using array offsets */
Si el bloque de memoria devuelto por malloc
no eran lógicamente contigua a su programa, lo haría no ser capaz de acceder al bloque con aritmética de puntero o subscripción de matriz.
Detrás de escena, su sistema operativo puede mover otros bloques de memoria que se pueden mover, usar memoria virtual, intercambiar otros elementos a la memoria virtual, etc., para aumentar el HEAP asignado a su programa. Malloc puede ser una llamada muy rápida o muy cara, dependiendo de qué más esté sucediendo en ese sistema y el espacio HEAP asignado a su programa.
memoria de pila (la parte visitada con sistema dinámico de llamadas en C) está potencialmente sujeto a la fragmentación. Digamos que asignó la cantidad de bloques de 20 bytes donde la memoria escasea. Ahora imagina que liberas todos los otros bloques de esos bloques. Tendrá una memoria muy fragmentada ya que los bloques asignados con malloc
no se pueden mover si afecta al puntero que el programa utiliza para acceder al bloque. (Se puede mover de forma transparente, pero no cuentan con que el ser eficiente.)
Si va a realizar muchas llamadas a la pila de memoria, tenga en cuenta el cambio de su lógica para utilizar realloc
para crecer y reducir el tamaño de la memoria, según sea necesario. Un gran 'gotcha' con realloc es que el puntero a sus datos existentes puede cambiar, así que solo use 1 puntero a él. Realloc permite que el sistema operativo mueva los datos según sea necesario para ajustarse mejor a lo que está disponible en HEAP. Evitará (en su mayoría) el potencial de fragmentación de la memoria de esa manera.
Para bloques de 20 bytes rápidos, considere el uso de la pila. Esto es para lo que sirve. Consulte this SO post para ver las características de STACK vs HEAP.
Leer el C Guide of calloc, malloc, realloc, free para obtener más información.
+1 muy informativo. – birryree
arco humilde :-) [relleno adicional para la longitud de la publicación mínima] –
Sin embargo, esto nunca afectará a un puntero devuelto de 'malloc'. – dawg