vetty

局部变量的入栈顺序

写这篇文章的初衷是遇到一个十分有意思的面试题,具体内容如下:

 1 int function(const int src[16]){
 2     int val1=0;
 3     int dst[16]={0};
 4     int val2=0;
 5     const int *psrc=src;
 6     //问题1:如下代码行输出什么?
 7     fprintf(stdout,"size of src=%lu\n",sizeof(src));
 8     //问题2:如下代码有什么副作用?
 9     for(int i=0;i<=16;i++){
10      dst[i]=*psrc+i;
11      psrc++;
12     }
13     return 0;
14 }

问题1的答案在64位系统下答案是8,这个好理解;问题2的答案是val1被覆盖,可能很多人会疑问为什么不是val2被覆盖呢?这就牵扯到局部变量的入栈顺序。经过一个简单的测试,得出结论,测试代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 int function(const int src[2],int n){
 4     int val1=0;
 5     int dst[2]={0};
 6     int val2=0;
 7     int val3 = 0;
 8     
 9     cout << "The src0 addr is:" << &src[0] << endl;
10     cout << "The src1 addr is:" << &src[1] << endl;
11     cout << "The val1 addr is:" << &val1 << endl;
12     cout << "The dst0 addr is:" << &dst[0] << endl;
13     cout << "The dst1 addr is:" << &dst[1] << endl;
14 
15     cout << "The val2 addr is:" << &val2 << endl;
16     cout << "The val3 addr is:" << &val3 << endl;
17     return 0;
18 }
19 int main(){
20     
21     int a[2] = {1,2};
22     function(a,20);
23 }

运行结果如下:

可以看出先声明的先入栈,栈地址是不断减小的,在这里dst[0]的地址是小于dst[1]的地址的,因为数组的地址是逐渐增加的,所以上述的问题2的答案就好理解了,当数组越界时,dst[16]的对应位置就是val1,所以val1会被覆盖。

posted on 2015-08-14 19:53  cocos2014  阅读(2089)  评论(0编辑  收藏  举报

导航