日期:2014-05-16  浏览次数:20831 次

函数参数入栈顺序以及参数地址间隔的问题
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