2011-03-04 5 views
1

私はC言語を学んでおり、いくつか質問があります。 int i = 0のような変数を宣言するとき。 私はにスタックのアドレスを持っていますよね?Cのスタック上のデータの編成?

私は関数がメモリ内でどのように構成されているのだろうかと思います。たとえば、私は次のような関数を持っています:

int myF() { 
    int x = 2, y = 3; 
    int z = x + y; 
    return x; 
} 

このメソッドはどのようにスタック化されていますか?私は "myF"という名前は他のvarialbesと同じようにメモリアドレスを持っていますか? "myF"には、機能の終了位置を示す終了アドレスのようなものが必要ですか?

私は間違っていますか?

ありがとうございます。

+1

コンパイラによっては、Cコードのアセンブリリストを作成すると役立ちます。そうすれば、指示が表示され、どのように動作するかがわかります。 –

+1

Cはスタックを指定していないので、自動変数の配置方法や、特定の実装に依存します。 – user611775

+2

変数はスタック内で終わるのが普通ですが、それらは完全に最適化されたり、レジスタ内にのみ存在したりすることができます。コンパイラがコードをどのように翻訳したかについては何も想定しないでください。 – pmg

答えて

1

図は、それが組織化された方法を示し役立ちます(あなたの例ではiなど)

Stack layout

  • ローカル変数は、スタック上にあってもよいが、それは、コンパイラに依存します。典型的なスタックレイアウトはローカル変数領域を示しますが、たとえば、コンパイラの中には変数の代わりにレジスタを使用するものがあります。
  • myFにはアドレスはありませんが、機能はありません。アドレスは通常、実行可能コードの別の領域にあります。
  • 「終了アドレス」がありません。代わりに、呼び出し元の関数によって戻りアドレスが保存されます。 myFが関数の終わりに達し、クリーンアップ操作を実行すると、戻りアドレスに分岐します。このリターンアドレスを変更してコードを悪質なコードに分岐させて実行させようとする悪用があるため、実際には問題になる可能性があります。
+0

-1:あなたの投稿にあまりにも多くの癖 – pmg

1

通常、関数のコードは読み取り専用メモリーセグメントに別々に格納され、スタック(「自動ストレージ」)はそれと重複しません。また、コンパイル時にmyFという名前が取り除かれ、関数はあるアドレスから始まり、 "現在の関数からの復帰"を意味する特別なプロセッサ命令で終わる単なるコードになります。

1

私はスタックのアドレスを持っていますか?

必ずしもそうである必要はありません。

この方法はスタックでどのように構成されていますか?

答えは、コンパイラとプロセッサのアーキテクチャによって異なります。いくつかのコンパイラはローカル変数をスタックに格納します。他はレジスタを使用します。

詳細については、scope of variablesを参照してください。

関連する問題