首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

函数参数入栈顺序以及参数地址间隔的有关问题

2012-03-27 
函数参数入栈顺序以及参数地址间隔的问题1。linux下写了这么一个函数void test(short a ,char* b,int c){pr

函数参数入栈顺序以及参数地址间隔的问题
1。linux下写了这么一个函数
void test(short a ,char* b,int c){ 
  printf("%p\n",&a); 
  printf("%p\n",&b); 
  printf("%p\n",&c); 


main(){
  short a = 1;
  char b = '2';
  int c = 3;
  test(a,&b,c);
}

输出结果0xbfe77426
  0xbfe77434
  0xbfe77438

按着参数从右向左入栈的顺序,c的地址比b大4,正常。b的地址比a大14这是为什么啊?如果是字节补齐的话,也不该差这么多。
中间的那12个字节存放的是什么?

2。后来我将b改成char类型 test(short a,char b,int c)
输出结果0xbfe5ed56
  0xbfe5ed55
  0xbfe5ed68

不仅地址差很多,而且从地址上看的话,好像是a比b先进栈啊?更加迷惑。。

3。如果函数的参数都是int和地址类型的话,地址相差都是4,也符合从右向左入栈的顺序。这个倒是很正常。。

求大牛们指点。。


[解决办法]
> "如果是这样的话,转存后的变量,存放位置有什么规律么?为什么会偏移了14个字节,中间这么多字节存放的什么? 
非常感谢你前面的回答,同时如果知道我上面的两问的话,还希望能再指教"

存放位置是在局部变量帧不固定的位置,当然也有一定的规律。
1. 地址一定比真正的参数地址低,也就是为什么1楼程序打印的第一行远小于2、3行
2. 地址和真正的参数地址之间隔了函数返回值和上一帧帧地址,4+4=8,而你真正的参数a在0xbfe77430,再加local_a本身,正好14:栈结构分析如下(各版本之间可能有小差异):
0xbfe77426: local_a
0xbfe77428: 上一帧帧地址
0xbfe7742c: 函数返回地址
0xbfe77430: a
0xbfe77434: b 
0xbfe77438: c 

热点排行