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 }
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 }
2 {
3 out (vec[i], i);
4 i ++ ;
5 }
另外,除了stdcall调用规定外,还有其他的调用规定,如fastcall,cdecl,thiscall等。这几种调用规定有相似之处,也有区分,具体可参考:http://hi.baidu.com/vcprogrammer/blog/item/6a37916ed8787ed980cb4ac5.html