機能を理解しようとしてい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)
の最初の 2 つの呼び出しが同じ値を返さないのはなぜですか? ブレーク アドレスを変更する 2 つの呼び出しの間に何が起こるでしょうか。
EDIT: アドレスを変数に保存すると問題が解決します:
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);
}