16

機能を理解しようとしてい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);
}

4

1 に答える 1