Nuestro equipo de trabajo ha estado por horas buscando la respuesta a tu pregunta, te compartimos la soluciones y nuestro objetivo es servirte de mucha apoyo.
Si cambiamos el programa para ver dónde está el malloc
la memoria es:
#include
#include
#include
void program_break_test()
printf("%10pn", sbrk(0));
char *bl = malloc(1024 * 1024);
printf("%10pn", sbrk(0));
printf("malloc'd at: %10pn", bl);
free(bl);
printf("%10pn", sbrk(0));
int main(int argc, char **argv)
program_break_test();
return 0;
Es quizás un poco más claro que sbrk
no cambiaría El recuerdo que nos da malloc
está siendo mapeado en una ubicación muy diferente.
También podrías usar strace
en Linux para ver qué llamadas al sistema se realizan y descubrir que malloc
esta usando mmap
para realizar la asignación.
malloc
no se limita a usar sbrk
para asignar memoria. Podría, por ejemplo, utilizar mmap
mapear un gran MAP_ANONYMOUS
bloque de memoria; normalmente mmap
asignará una dirección virtual bien alejada del segmento de datos.
También hay otras posibilidades. En particular, malloc
, al ser una parte central de la biblioteca estándar, no se limita a las funciones de la biblioteca estándar; puede hacer uso de interfaces específicas del sistema operativo.
Si utiliza malloc
en su código, llamará brk()
al principio, asignó 0x21000 bytes del montón, esa es la dirección que imprimió, por lo que la Pregunta 1: la siguiente malloc
Los requisitos de s se pueden cumplir desde el espacio preasignado, por lo que estos mallocs en realidad no llamaron brk
es una optimización en malloc
. Si la próxima vez que desea malloc el tamaño más allá de ese límite, un nuevo brk
será llamado (si no es más grande que el mmap
límite).
Si sostienes algún titubeo y forma de progresar nuestro post eres capaz de escribir un comentario y con mucho gusto lo leeremos.