¿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);
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta