スポンサード リンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサード リンク
-- : -- : -- | スポンサー広告 | page top↑
スポンサード リンク

C言語におけるスタック領域の使われ方

スタック領域 C言語ではどのようにスタック領域が使われているか、変数のアドレスを出力してそれを直感的に理解できるように図示して考察しました。

実験には次のプログラムを用いました。


#include

void func(int f_arg1, int f_arg2) {
  int f_var1, f_var2;

  printf("&f_arg1 = %p, &f_arg2 = %p\n", &f_arg1, &f_arg2);
  printf("&f_var1 = %p, &f_var2 = %p\n", &f_var1, &f_var2);
}

int main() {
  int m_var1, m_var2;

  printf("&m_var1 = %p, &m_var2 = %p\n", &m_var1, &m_var2);
  printf("&func   = %p\n", &func);
  func(1, 2);

  return 0;
}

私の環境(Cygwin)では以下のような結果が得られました。


$ ./a
&m_var1 = 0x22cce4, &m_var2 = 0x22cce0
&func   = 0x401050
&f_arg1 = 0x22ccc0, &f_arg2 = 0x22ccc4
&f_var1 = 0x22ccb4, &f_var2 = 0x22ccb0

そして、これを図に整理しました。

スタック領域

自動変数や関数はメモリのスタック領域にのるため、宣言順に下から並んでいます。しかし、よく見ると「おや?」と思うのではないでしょうか?関数funcの第一引数f_arg1と第二引数f_arg2が逆順に積まれていますね。

これは何かの間違いや偶然ではなく、C言語では引数が後ろから順にスタックに積まれるためで、printf()のような可変長引数を持つ関数をサポートするためにこのような仕様になっているようです。

参考にした書籍

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)
前橋 和弥
技術評論社 (2001/01)
売り上げランキング: 10938

参考になる書籍

この記事を読んで何のことかさっぱりだった方にはこちらの書籍がおすすめです。たいへんやさしく、そしてわかりやすく書かれたC言語の入門書です。

やさしいC 第3版 [やさしいシリーズ]
高橋 麻奈
ソフトバンククリエイティブ (2007/08/30)
売り上げランキング: 20254

スポンサード リンク

テーマ:プログラミング - ジャンル:コンピュータ - ソーシャルブックマーク: この記事をクリップ! Yahoo!ブックマークに登録

00 : 40 : 01 | プログラミング-C/C++ | トラックバック(0) | コメント(0) | page top↑
<<0-15(10進数)を0-F(16進数)に基数変換する関数dtoh | ホーム | 各大学のCS学科で学ぶプログラミング言語>>
コメント

コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
http://networkprogramming.blog18.fc2.com/tb.php/7-44f6ec61
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |

プロフィール

TBVector

Author:TBVector

プロフィール

メールフォーム

記事検索

Google

最近の記事

人気の記事

過去の記事

カテゴリー

タグランキング

リンク

最近のコメント

最近のトラックバック

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。