2015-11-26 30 views
7

C99では、次のコード行は、ヒープ上のメモリ領域を指す変数ptrをスタック上に作成します。プログラミング言語のスタックとヒープ

int *ptr = (int*)malloc(sizeof(int)*10); 

ここでスタックとヒープの定義はありますか。私はC99の言語仕様でそれらを見つけることができませんでした。

オペレーティングシステムまたは命令セットのアーキテクチャまたはその他のものによってスタックとヒープが定義されていますか。

もう1つの関連する質問は、C#のスタックとヒープの概念がC99の概念とまったく同じかどうかです。 C#コードは.Netフレームワーク上で実行されるので、概念がC99と同じかどうかはわかりません。

+0

これは部分的にお手伝いします。素晴らしい答えがあります。 http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – niksofteng

+0

あなたの情報をありがとう。しかし、主な問題は、定義はどこにあるのでしょうか? – mingpepe

+0

Cでは、「スタック」と「ヒープ」は口語です。 – immibis

答えて

1

ヒープは、マシン上で実行されている特定のプロセスに割り当てられているメモリの量です。スタックは、現在与えられたプロセス上で実行されているスレッドに割り当てられている、一般に小さなメモリ量です。

ローカル変数を作成すると、その変数はスタックに格納されます。このメモリの選択は、スコープを扱うとき、スタックデータ構造と同じように、アドレス可能なスペースから異なる値がプッシュまたはポップされるため、スタックと呼ばれます。

変数をmallocすると、ヒープに格納され、複数のスコープに渡って保存されます。

ヒープに格納されているものは、使用し終わったら空きでなくてはなりませんが、OSはスタック上のものを自動的に処理します。

チェックアウトhttp://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

6

スタックとヒープは、実装の詳細です。あなたが発見したように、C言語の定義にはまったく言及されていません。

C言語の定義では、オブジェクトの保存期間がのとなっています。記憶期間がautoのオブジェクトは、その囲むブロックにまたがる寿命があります。ハードウェアスタックがその動作を実装するのを容易にするので、Cの実装はほとんどすべてそうです。 allocatedの保存期間を持つオブジェクトは、freeへの呼び出しまでmalloc/calloc/reallocコールまでの有効期間を持ちます。この場合も、ほぼすべてのC実装が、その動作のためにシステムヒープを利用しています。

ただし、オブジェクトの格納所要時間の要件を満たすシステム提供のスタックまたはヒープを使用する実装では、にはがありません。それはちょっとだけ仕事になるでしょう。

+0

システム提供のスタックまたはヒープとは何ですか?ハードウェアの視点では、それらは正しいことですか?彼らはオペレーティングシステムによって定義されていますか? – mingpepe

+0

@mingpepe - スタックは通常、ハードウェアプラットフォームによって定義されます(私がよく知っているほとんどのCPUは、スタック管理のために2つのレジスタを使用します)。ヒープは、ハードウェアとOSの間で混在しています。実装は異なります。 –

+0

ハードウェアとOSの間にヒープが混在しているとはどういう意味ですか? – mingpepe

関連する問題