1. ホーム
  2. c

[解決済み] sbrk(0) と sbrk(size) は両方とも同じアドレスを返します。

2022-02-16 21:02:03

質問

#include<unistd.h>
#include<stdio.h>

void *my_malloc(size_t size){
 void *p;
 void *q;
 p = sbrk(0);
 /* If sbrk fails, we return NULL */
 q = sbrk(size);
 if(q == (void *)-1){
  return NULL;
 }
 printf("\n size : %d  p : 0x%x q : 0x%x \n",size,p,q);
 return p;
}
int main(){
 int *p;
 p = my_malloc(5);
 printf("\n p : 0x%x \n",p);
}

brk(2) は与えられたアドレス addr にブレークを置き、成功すれば 0 を、そうでなければ -1 を返す。グローバルな errno シンボルは、エラーの性質を示す。 sbrk(2) は、与えられた増分でブレークを移動する。システムの実装に依存して、前のブレークアドレスまたは新しいブレークアドレスを返す。失敗すると、(void *)-1を返し、errnoを設定する。システムによっては、sbrkは負の値を受け取ることができる(マップされたメモリを解放するため)。 sbrkの仕様はその結果の意味を固定していないので、ブレークを移動する際に返される値を使用することはないだろう。しかし、sbrkの特殊なケースとして、incrementがnulの場合(つまりsbrk(0))、戻り値は実際のブレークアドレスとなります(前と新しいブレークアドレスは同じです)。 つまり、sbrkはmallocを実装するための主要なツールとして使われているのです。

sbrk(0)もsbrk(size)も同じアドレスを返すので、sbrk(size)はsbrk(0)から5バイト先のアドレスを返すと思ったのですが、どうでしょうか?

どのように解決するのですか?

を使用する場合 sbrk(0) を取得します。 現在 "break"アドレスです。

を使用する場合 sbrk(size) を取得します。 break"アドレス、つまり変更前のものです。

つまり、サイズが0で一度呼び出した後に、正のサイズで呼び出すと、どちらも同じ値が返されます。サイズがゼロのときにもう一度呼び出すと を返し、正のサイズの呼び出しは 新しい のアドレスになります。