I'm trying to understand the sbrk()
function.
From what I know:
sbrk(0)
returns the current address of the break and doesn't increment it.
sbrk(size)
increments the address of the break by size
bytes and returns the previous address of the break.
So I created something to test it:
#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
}
So I'm expecting to see a result looking like this:
sbrk(0) = 0x1677000 // x value
sbrk(0) = 0x1677000 // x value
sbrk(5) = 0x1677000 // x value
sbrk(0) = 0x1677005 // x value + 5
but instead I'm getting this:
sbrk(0) = 0x1677000 // x value
sbrk(0) = 0x1698000 // y value
sbrk(5) = 0x1698000 // y value
sbrk(0) = 0x1698005 // y value + 5
Why don't the first two calls of sbrk(0)
return the same value?
What happens between those two calls that changes the break address?
EDIT : Storing addresses in variables solves the problem:
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);
}
printf
might use some dynamic memory stuff. Try assigning the values to variables instead and print them at once. – Unusualsbrk
before callingprintf
. Your updated code does basically just the same as the first and will have the same problem. – Reevesprintf
s – Unusualprintf
implementation to find out. – Unusualstdout
. – Reevesmalloc()
in a few places. – Percaline