为什么调用 sbrk(0) 两次会给出不同的值?
Why does calling sbrk(0) twice give a different value?
我正在尝试了解 sbrk()
函数。
据我所知:
sbrk(0)
return 是中断的当前地址并且不会递增它。
sbrk(size)
将中断的地址增加 size
个字节,return 是中断的前一个地址。
所以我创建了一些东西来测试它:
#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)
return 的前两次调用的值不同?
这两个更改中断地址的调用之间会发生什么?
编辑:
在变量中存储地址解决了问题:
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);
}
您的程序执行以下调用序列:
sbrk()
printf()
sbrk()
printf()
...
第一次调用printf
在内部调用malloc
为stdout
分配缓冲区(stdout
默认是行缓冲的,但是缓冲区是按需创建的第一次打印到它)。
这就是为什么第二次调用 sbrk
returns 不同的值。
( 没有直接关系,但来自 valgrind 的错误消息暴露了隐藏在 printf
中的底层 malloc
调用的存在。)
您的第二个示例预先执行了所有 sbrk
调用,因此其他函数在您背后调用 malloc
也就不足为奇了。
我正在尝试了解 sbrk()
函数。
据我所知:
sbrk(0)
return 是中断的当前地址并且不会递增它。
sbrk(size)
将中断的地址增加 size
个字节,return 是中断的前一个地址。
所以我创建了一些东西来测试它:
#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)
return 的前两次调用的值不同?
这两个更改中断地址的调用之间会发生什么?
编辑: 在变量中存储地址解决了问题:
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);
}
您的程序执行以下调用序列:
sbrk()
printf()
sbrk()
printf()
...
第一次调用printf
在内部调用malloc
为stdout
分配缓冲区(stdout
默认是行缓冲的,但是缓冲区是按需创建的第一次打印到它)。
这就是为什么第二次调用 sbrk
returns 不同的值。
(printf
中的底层 malloc
调用的存在。)
您的第二个示例预先执行了所有 sbrk
调用,因此其他函数在您背后调用 malloc
也就不足为奇了。