关于C/C++中函数形参和局部变量地址分配的问题

HymanLiuTS 2016-09-27 01:58:12

#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个字节,求解惑???
...全文
424 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-09-29
  • 打赏
  • 举报
回复
对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!
  • 打赏
  • 举报
回复
这种东西都是编译器看情况处理,没有规定一定要按照某种规则。 所以挨着还是不挨着没啥关系。
HymanLiuTS 2016-09-28
  • 打赏
  • 举报
回复
引用 2 楼 pengzhixi 的回复:
在i和a之间还需要保存 函数的返回地址,旧的ebp值和一些必要的寄存器值。
函数的返回地址和寄存器的值是保存在形参和局部变量之间吗?我之前看过一些资料是说压栈顺序分别是: 寄存器值->函数返回地址->函数返回值->形参->局部变量,所以一直以为形参和局部变量地址是紧挨着的?
HymanLiuTS 2016-09-28
  • 打赏
  • 举报
回复
看了汇编代码,虽然不怎么懂,但是还是看了些端倪,linux中每次都是先压入形参,然后再预留20个字节存放函数的返回地址和返回值,最后在存入局部变量,windows系统可能预留的字节数不一样,但是原理大同小异。
赵4老师 2016-09-27
  • 打赏
  • 举报
回复
paschen 2016-09-27
  • 打赏
  • 举报
回复
看汇编压入栈的内容,还会有函数的返回地址等
pengzhixi 2016-09-27
  • 打赏
  • 举报
回复
在i和a之间还需要保存 函数的返回地址,旧的ebp值和一些必要的寄存器值。
fefe82 2016-09-27
  • 打赏
  • 举报
回复
看汇编 看看他们都在哪

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧