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