当我们调用一个函数(假设有3个参数)时,变量如何存储在堆栈内存中。
答案 0 :(得分:4)
它完全依赖于实现,如何将参数传递给函数。
函数参数甚至可能不会在堆栈上传递;例如,它们可以通过寄存器传递。
您需要查找特定平台的信息,以确定如何传递参数。维基百科有一整页专门用于the various x86 calling conventions。
答案 1 :(得分:1)
当参数被推入堆栈时,C从右到左执行此操作。但是,根据体系结构和参数数量,可能不会使用堆栈(或仅部分使用堆栈),而是使用寄存器。
为了论证,让我们说我们正在处理x86架构(32位)。堆栈框架看起来像......
(Stack grows down. High stack address is here)
arg3
arg2
arg1
ret addr <--- Auto pushed by 'call'
old base ptr <--- Called function typically saves the old base ptr
... <--- Carve space for local variables
(Low stack address is here.)
继续上面的例子,被调用的函数可以使用以下内容访问参数...
movl 8(%ebp), %eax // move arg1 into EAX
movl 12(%ebp), %edx // move arg2 into EDX
等等。
如果我没记错的话,PowerPC有八(8)个寄存器可用于传递参数 - r3 ... r10包含。至于其他架构,你必须查找它们。
希望这有帮助。