[解決済み] 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で一度呼び出した後に、正のサイズで呼び出すと、どちらも同じ値が返されます。サイズがゼロのときにもう一度呼び出すと 後 を返し、正のサイズの呼び出しは 新しい のアドレスになります。
関連
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】strcmpが機能しない
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み】0LLや0x0ULの意味は何ですか?