2012-01-11 12 views
1

私はUNIX試験の準備をしており、C変数のメモリの場所について質問があります。 のは、我々はこの関数の引数のメモリ位置

char sth; 
int some_function(int arg) { 
    int some_int; 
    // some code here 
} 

ようなコードがあるとしましょうので、私は、スタック上some_intsthはヒープ上に配置されていると仮定しますが、argはどこにありますか? 誰かがC変数の管理方法を説明できますか?

ありがとうございました

+0

スタックにすべて入っていませんか? –

+0

Q:それらはすべてスタックに入っていませんか? A:いいえ。「int some_int」は間違いなくスタックにあります。 "int arg"は間違いなくスタックを介して渡されます。それがポインタの場合、ポインタはスタックに渡されますが、実際のデータが指し示されている場所はどこでもかまいません。そして、 "sth"は静的なデータのように見えるので、スタックにはありません。 – paulsm4

答えて

4

このすべては実装に依存しています。 Cの標準では、スタック、ヒープなどの言葉を発声しません。変数に基づいて、その記憶域に応じて予測される動作についてのみ説明します(staticexternregisterなど)。

このように通常そう言われていますが、argは機能のために用意されているスタックフレームに配置されます。範囲はsome_intのスコープと同じ機能に限定されています。

ところでsthはヒープ上にないため、静的なグローバルストレージがあります。

1

ここにあるすべてのものは完全にプラットフォームに依存しており、実際にはC言語ではありませんが、どのように私のコンパイラがそれを行うのですか?

sthは静的(グローバル)な記憶域を持っているため、おそらくヒープ上ではなくグローバルデータセグメントにあります。 some_intは実際にはローカルスタックフレームsome_functionにあります。変数argにはsome_functionが設定されていますが、どこにあるかはコンパイラによって異なりますが、通常は「呼び出し規約」として知られています。呼び出し元または呼び出し先のスタックフレームと呼び出し元によって割り当てられ、クリーンアップされる場合がありますまたは呼び出し先に送信するか、レジスタに渡して、まったくメモリには入れないでください。

0

argは、少なくともデスクトッププラットフォーム用にスタックに配置されます。

「楽しさと利益のためにスタックスマッシング」と呼ばれる文書を読み、メモリがC.

0

sthに管理されている方法を理解するであろうがargsome_intがスタックにある、静的なメモリです。 some_functionが呼び出されると、argがスタックにコピー( "プッシュ")されます。ヒープはダイナミックメモリで、実行時に割り当てられたデータを含みます(たとえば、mallocを使用)。

0

引数は(ほとんど例外なく)スタックに渡されます。

あなたがコンピュータのアーキテクチャにいることを確認することができます。

printf("%p - %p\n", &arg, &some_int); 

通常、これらはお互いに数バイト以内である必要があります。

編集:sthはヒープには割り当てられませんが、プログラムのデータセグメントには割り当てられません。つまり、コンパイラはすでにコンパイル時にメモリを割り当てています。

0

sthはおそらくblock static storage(a.k.a.

a)はヒープ:あなたの言語の「BSS」、プラットフォームに依存するが):あなたからの変数領域を割り当てることができる場所

繰り返しますが、これは完全に「プラットフォームに依存」ですが、四つの領域「セグメント」は、一般的にありますランタイムは "ヒープ"データを管理します。これらは "自動" 変数

C)BSS:いないに関わらず(変数)静的データ

D)データ:初期化 "のmalloc()" または "新" への呼び出し)

b)のスタックと(そして多くの場合、読み取り専用)静的データ

http://en.wikipedia.org/wiki/Data_segment

0

は、それは実装に依存します。引数はスタックフレームにプッシュされるか、レジスタに書き込まれるか、他のメカニズムによって渡されます。

言語定義では、さまざまなオブジェクトを格納する必要がありません。それらのオブジェクトがどのようにふるまうべきかを指示するだけです。