局部变量的入栈顺序
写这篇文章的初衷是遇到一个十分有意思的面试题,具体内容如下:
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) 编辑 收藏 举报