1

でプログラムのメモリ割り当てを調べていましたC。すべてのグローバル変数と静的変数がヒープに格納されていることを知っています。また、スタックにはすべての関数呼び出しが格納されます。ただ、ここでひとつ疑問があります。次の関数を呼び出しているとします。

int ret;
int num = 10;
int arr[3] = {1,2,3};
int *ptr = &arr[0];
ret = giveNumber(num, ptr);

ここで、関数呼び出しのパラメーターgiveNumer()も同じスタックに格納されることを読みました。しかし、それらはどのような順序で保存されますか? スタックの一番上をポップした場合、どのパラメータが最初にポップされますnumptr?

4

2 に答える 2

3

すべてのグローバル変数と静的変数がヒープに格納されていることを私は知っています
いいえ、そうではありません。
標準に従って、それらは実装定義のメモリ領域、通常はデータセグメントとBSSに格納されます。

スタックの一番上をポップした場合、どのパラメーターが最初にポップされるか、numまたはptr
関数への引数の評価の順序は指定されていませ
したがって、コンパイラの実装によって異なります。コンパイラは、次の引数を評価する場合があります。

  • 左から右または
  • 右から左または
  • その他のランダムな順序

したがって、表示される動作と順序はこれに依存します。

于 2012-04-09T17:13:01.293 に答える
0

@Als が既に述べたことに加えて、x86 のほとんどのコンパイラは_cdecl、引数が右から左に評価される呼び出し規則に従います。詳細はこちら

http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#Standard_C_Calling_Conventions

于 2012-04-09T17:18:36.967 に答える