情報科学を学ぶ大学生がプログラミング(C言語,Javaなど)、ネットワーク、資格試験(情報処理技術者試験,CCNA)などに関する記事を書いています。
実験には次のプログラムを用いました。
#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言語の入門書です。
Author:TBVector
私のサイト
ブックマークとRSS
友達のサイト
あわせて読みたい
はてなリング