2017-04-20 5 views
0

今日、私はmalloc(1024)と呼んで、ヒープで遊んでいました。私はヒープの構造をほとんど理解しているので、何が記憶されているかを印刷すると、「00000000 00000409 00000000 00000000 ....」と表示されていました。ヒープには何がありますか? C linux

1032バイトヒープの一番上のチャンクを見つける。代わりに、malloc(1024)の別の呼び出しが私の最初のものの後に起こったかのように、別の塊を見つけました。このチャンクで

は次のとおりです。

00000000 00000409 30387830 65336234 
30203a30 30303030 20303030 30303030 
30303030 30303020 30303030 30302030 
34303030 33203930 33303330 20303330 
30333033 30333032 33343320 33303330 
33332030 39333032 000a3233 00000000 

に変換され:これが存在する理由、誰もが知ってい

08x0e3b40 :00000 00000000000000 000000 040003 903030 03003030302343 303033#09302 
23 

?私はmallocを一度呼び出すだけだと確信しています。そして、私はどんなサイズのmallocでも常にそこにいるようです。

+2

マシンには他にも何かがあるので、また何を期待していたのですか? (例:*「ヒープの一番上のチャンク」とは何ですか?) – UnholySheep

+1

多分ゼロを含む文字列でprintを呼び出すことはありませんでしたか? ASCII 30303030? – stark

+1

'brk'の移動量(データセグメントサイズの変更)は、アロケータによって異なります。あなたが実際にあなたの 'malloc'呼び出しで要求した以上に動かすかもしれません。したがって、データが必ずしもヒープの先頭にあるとは限りません。 – Arash

答えて

4

mallocは、ヒープ上に特定の量のメモリを予約し、このメモリブロックへのポインタを戻します(または、所望のメモリブロックを割り当てることができなかった場合はNULL)。ただし、mallocはどのような方法でもメモリブロックを初期化しません。 0またはその他の値では入力されません。それはそのままの状態でコンテンツを保持します。

したがって、実際には、「プログラムの開始時にヒープの最初の内容は何ですか?」という質問があります。答えは:それはオペレーティングシステムに依存します。メモリのどの部分が実行時にプログラムに割り当てられているかによって異なります。このメモリブロックの内容は、ランダムなものでもなく「まったく定義されていない」ものです。これは値のいくつかの反復パターン、ゼロにすることができます、それはすべてになることができます。

プログラムのヒープのさまざまな部分を調べると、前もってmallocを使用していたかどうかにかかわらず、この「何か未定義の」コンテンツが表示されます。あなたの場合と同じように、繰り返しパターンが表示されることがあります。ただし、割り当てられていないヒープの部分を「調べる」ことは、実際には未定義の動作であることに注意してください。

関連する問題