zoukankan      html  css  js  c++  java
  • 【转】函数参数入栈问题

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

    转自: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

  • 相关阅读:
    03.通过商品课程初心商品信息
    04.支付宝支付流程
    02.创建商品(表)应用(App)
    01.商品模块表结构
    七牛云上传视频
    Django之序列化器
    Django之抽象基类
    权限系统
    python实现简单工厂模式
    01.git基本操作
  • 原文地址:https://www.cnblogs.com/cyttina/p/3054944.html
Copyright © 2011-2022 走看看