首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于一段函数调度代码的地址有关问题

2012-09-19 
关于一段函数调度代码的地址问题大家知道c语言的函数调用时默认参数压栈顺序是从右向左的,又在栈是高至低

关于一段函数调度代码的地址问题
大家知道c语言的函数调用时默认参数压栈顺序是从右向左的,又在栈是高至低增长,于是第一个参数的地址比第二个参数的地址值低,但是:
请大家帮忙分析下:
linux GCC编译:
int func (char a,char b,int c)
{
  printf ("1:%u\n2:%u\n3:%u\n\n",(unsigned)&a,(unsigned)&b,(unsigned)&c);
}

int func2 (int a,int b)
{
  printf ("1:%u\n2:%u\n\n",(unsigned)&a,(unsigned)&b);
}
int main(void)
{
  func (1,2,3);
  func2 (1,2);
}

输出结果: 
1:3217957628
2:3217957624
3:3217957656

1:3217957648
2:3217957652

func2 正常
为什么func 会出现这种"变态地址"呢?



[解决办法]
函数参数的顺序问题
对于编译阶段而言
语言并没有规定顺序
这个要取决于编译器的设计
包括编译器对于程序的自动优化
都可能导致不可预期的结果


[解决办法]
直接看汇编就清楚了,编译器在调用函数的时候不是一成不变的,并不是每次调用函数参数都需要新入栈。比如函数嵌套调用的时候,里面的函数使用了外面函数的参数,这时候就不需要再给参数压栈了,直接使用栈里已有的参数就可以了。甚至有些时候还会通过寄存器传参,比如C++的this指针,一般就是通过ECX传的。
[解决办法]
void func (char a,char b,int c)
{
printf ("1:%p\n2:%p\n3:%p\n\n",&a, &b,&c);
}

void func2 (int a,int b)
{
printf ("1:%p\n2:%p\n\n",&a, &b);
}
int main(void)
{
func (1,2,3);
func2 (1,2);
}

对你的代码做了一下小的修改,还有你的函数定义为int类型,那就要有返回值,如果不需要返回值,那就使用void类型。
我在linux下编译和执行后,符合你上面说的:“参数压栈顺序是从右向左的,又在栈是高至低增长”。参数压栈和编译器还是有关系的。
[解决办法]
楼上说得对,参数压栈和编译器还是有关系的。

热点排行