我正在尝试理解sbrk()
函数。
根据我的了解:
sbrk(0)
返回当前断点地址,不会增加它。
sbrk(size)
将断点地址增加size
字节,并返回先前的断点地址。
所以我创建了一个测试程序:
#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
}
所以我希望看到的结果应该是这样的:
sbrk(0) = 0x1677000 // x value
sbrk(0) = 0x1677000 // x value
sbrk(5) = 0x1677000 // x value
sbrk(0) = 0x1677005 // x value + 5
但是我得到的却是这个:
sbrk(0) = 0x1677000 // x value
sbrk(0) = 0x1698000 // y value
sbrk(5) = 0x1698000 // y value
sbrk(0) = 0x1698005 // y value + 5
为什么 sbrk(0)
的前两次调用返回值不同?在这两次调用之间发生了什么导致断点地址发生变化?编辑:将地址存储在变量中可以解决该问题。
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);
}
stdout
分配缓冲区。 - Some programmer dudemalloc()
。 - rumpelsepp