¿Por qué llamar a sbrk (0) dos veces da un valor diferente?
Estoy tratando de entender elsbrk()
función.
Por lo que sésbrk(0)
devuelve la dirección actual del corte y no la incrementa.sbrk(size)
incrementa la dirección de la ruptura ensize
bytes y devuelve la dirección anterior del corte.
Así que creé algo para probarlo:
#include <unistd.h>
#include <stdio.h>
int main(void)
{
printf("sbrk(0) = %p\n", sbrk(0)); // should return value x
printf("sbrk(0) = %p\n", sbrk(0)); // should return value x
printf("sbrk(5) = %p\n", sbrk(5)); // should return value x
printf("sbrk(0) = %p\n", sbrk(0)); // should return value x + 5
}
Así que espero ver un resultado como este:
sbrk(0) = 0x1677000 // x value
sbrk(0) = 0x1677000 // x value
sbrk(5) = 0x1677000 // x value
sbrk(0) = 0x1677005 // x value + 5
pero en cambio obtengo esto:
sbrk(0) = 0x1677000 // x value
sbrk(0) = 0x1698000 // y value
sbrk(5) = 0x1698000 // y value
sbrk(0) = 0x1698005 // y value + 5
Por qué no las dos primeras llamadas desbrk(0)
devolver el mismo valor? ¿Qué sucede entre esas dos llamadas que cambia la dirección de corte?
EDIT: Almacenar direcciones en variables resuelve el problema:
int main(void)
{
void *toto1 = sbrk(0);
void *toto2 = sbrk(0);
void *toto3 = sbrk(5);
void *toto4 = sbrk(0);
printf("sbrk(0) = %p\n", toto1);
printf("sbrk(0) = %p\n", toto2);
printf("sbrk(5) = %p\n", toto3);
printf("sbrk(0) = %p\n", toto4);
}