【转】函数参数入栈问题

关于函数参数的入栈顺序,个人觉得这个例子很好,是一道笔试题目

转自:http://www.cnblogs.com/AnnieKim/archive/2011/05/16/2048062.html

void out(char *ch, int i)
 {
     cout<<ch<<","<<i<<endl;
 }
 
 int main()
 {
     vector<char *> vec;
     vec.push_back("str1");
     vec.push_back("str2");
 
     int i=0;
     out("---begin---", i);
 
     while(i < vec.size())
     {
         out(vec[i], i++);
     }
 
     out("----end----", i);
     return 0;
 }

这是一道改错题。

看了标题,自然知道是函数参数的入栈问题。

代码要实现的功能很简单,就是输出向量里的字符串。

问题在于第17行。

在Microsoft C++系列的编译器中,通常使用stdcall调用规定,并且stdcall规定参数是从右到左入栈。

这样一来,out函数首先将i入栈,然后计算i++,这时i已经加一,然后再将此时的vec[i]入栈。

当执行到最后一个元素时,必定会产生越界,而且前面打印的结果也并不是作者本身想要的。

总结一下,15-18行应规范写成:

while(i < vec.size())
{
    out(vec[i], i);
    i++;
}

另外,除了stdcall调用规定外,还有其他的调用规定,如fastcall,cdecl,thiscall等。这几种调用规定有相似之处,也有区分,具体可参考:http://hi.baidu.com/vcprogrammer/blog/item/6a37916ed8787ed980cb4ac5.html

 

 

posted @ 2013-05-02 16:57  三更_雨  阅读(221)  评论(0编辑  收藏  举报