#include<iostream> using namespace std; void print(int i) { int a=0; int b=1; int c=2; int arr[2]; cout<<"&i="<<reinterpret_cast<void*>(&i)<<endl; cout<<"&a="<<reinterpret_cast<void*>(&a)<<endl; cout<<"&b="<<reinterpret_cast<void*>(&b)<<endl; cout<<"&c="<<reinterpret_cast<void*>(&c)<<endl; cout<<"&a[0]="<<reinterpret_cast<void*>(arr)<<endl; cout<<"&a[1]="<<reinterpret_cast<void*>(&arr[1])<<endl; } int main() { int i; print(i); return 0; }
以上是本人验证函数调用中形参和函数局部变量分配内存地址的代码,结果如下
[Hyman@Hyman-PC cplus]$ ./a.out
&i=0xbffbb910
&a=0xbffbb8fc
&b=0xbffbb8f8
&c=0xbffbb8f4
&a[0]=0xbffbb8ec
&a[1]=0xbffbb8f0
本人的问题是为什么形参i的地址没有挨着局部变量a\b\c,比a的地址高了20个字节,求指导惑?
解决方案
5
看汇编
看看他们都在哪
看看他们都在哪
15
在i和a之间还需要保存 函数的返回地址,旧的ebp值和一些必要的寄存器值。
10
看汇编压入栈的内容,还会有函数的返回地址等
5
10
这种东西都是编译器看情况处理,没有规定一定要按照某种规则。
所以挨着还是不挨着没啥关系。
所以挨着还是不挨着没啥关系。