1 void out(char *ch, int i)
 
2 {
 
3     cout<<ch<<","<<i<<endl;
 
4 }
 
5 
 
6 int main()
 
7 {
 
8     vector<char *> vec;
 
9     vec.push_back("str1");
10     vec.push_back("str2");
11 
12     int i=0;
13     out("---begin---", i);
14 
15     while(i < vec.size())
16     {
17         out(vec[i], i++);
18     }
19 
20     out("----end----", i);
21     return 0;
22 } 

这是一道改错题。

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

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

问题在于第17行。

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

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

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

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

1 while(i < vec.size())
2 {
3     out(vec[i], i);
4     i++;
5 }

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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-14
  • 2022-01-11
  • 2022-12-23
  • 2021-11-26
  • 2022-12-23
猜你喜欢
  • 2021-11-23
  • 2022-01-15
  • 2021-07-06
  • 2021-08-20
  • 2021-07-05
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案