zoukankan      html  css  js  c++  java
  • 局部变量的入栈顺序

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

     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
    ",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会被覆盖。

  • 相关阅读:
    《软件测试自动化之道》读书笔记 之 底层的Web UI 测试
    《软件测试自动化之道》读书笔记 之 基于Windows的UI测试
    《软件测试自动化之道》读书笔记 之 基于反射的UI测试
    MS UI Automation Introduction
    Server-Side UI Automation Provider
    Client-Side UI Automation Provider
    Server-Side UI Automation Provider
    河边的苹果
    CommonJS和AMD/CMD
    webpack
  • 原文地址:https://www.cnblogs.com/cocos2014/p/4731016.html
Copyright © 2011-2022 走看看