DEBUG模式下, 内存中的变量地址分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DEBUG模式下, 内存中的变量地址分析相关的知识,希望对你有一定的参考价值。

测试函数的模板实现

[cpp] view plain copy
 
 技术分享技术分享
  1. /// @file my_template.h  
  2. /// @brief 测试数据类型用的模板实现  
  3.   
  4. #ifndef MY_TEMPLATE_H_2016_0123_1226  
  5. #define MY_TEMPLATE_H_2016_0123_1226  
  6.   
  7. template<int iArySize>  
  8. void fnTestDataType() {  
  9.     char szBuf[iArySize] = {‘\0‘};  
  10.     unsigned short wTmp = 0;  
  11.     int iTmp = 0;  
  12.     long lTmp = 0;  
  13.     float f = .0f;  
  14.     double dbl = .0;  
  15.       
  16.     char szBuf1[iArySize] = {‘\0‘};  
  17.     unsigned short wTmp1 = 0;  
  18.     int iTmp1 = 0;  
  19.     long lTmp1 = 0;  
  20.     float f1 = .0f;  
  21.     double dbl1 = .0;  
  22.       
  23.     printf("============================================================\n");  
  24.     printf("char array size = %d\n", iArySize);  
  25.     printf("------------------------------------------------------------\n");  
  26.     printf("&szBuf[0] = \t0x%p\n", &szBuf[0]);  
  27.     printf("&szBuf[%d] = \t0x%p\n", iArySize - 1, &szBuf[iArySize - 1]);  
  28.     printf("&wTmp = \t0x%p\n", &wTmp);  
  29.     printf("&iTmp = \t0x%p\n", &iTmp);  
  30.     printf("&lTmp = \t0x%p\n", &lTmp);  
  31.     printf("&f = \t\t0x%p\n", &f);  
  32.     printf("&dbl = \t\t0x%p\n", &dbl);  
  33.       
  34.     printf("&szBuf1[0] = \t0x%p\n", &szBuf1[0]);  
  35.     printf("&szBuf1[%d] = \t0x%p\n", iArySize - 1, &szBuf1[iArySize - 1]);  
  36.     printf("&wTmp1 = \t0x%p\n", &wTmp1);  
  37.     printf("&iTmp1 = \t0x%p\n", &iTmp1);  
  38.     printf("&lTmp1 = \t0x%p\n", &lTmp1);  
  39.     printf("&f1 = \t\t0x%p\n", &f1);  
  40.     printf("&dbl1 = \t0x%p\n\n", &dbl1);  
  41. };  
  42.   
  43.   
  44.   
  45. #endif // #ifndef MY_TEMPLATE_H_2016_0123_1226  

测试代码和实验结论

[cpp] view plain copy
 
 技术分享技术分享
  1. /// @file main.cpp  
  2. /// @brief DEBUG模式下, 内存中的变量地址分析  
  3.   
  4. #include <iostream>  
  5. using namespace std;  
  6.   
  7. #include "my_template.h"  
  8.   
  9. /** 试验结论 - <<DEBUG模式下, 内存中的变量地址分析>> 
  10.     如果定义多个变量 
  11.     DEBUG模式下, 内存中的变量地址和定义的顺序相同 
  12.     变量开始地址都是模式地址 
  13.     先定义的变量在内存高地址 
  14.     后定义的变量在内存低地址 
  15.  
  16.     Release模式下, 经过优化, 变量的内存地址和变量定义的顺序不相同! 
  17.     如果变量有越界访问的情况, Release模式下的越界访问情况未知. 
  18.     好像有一些规律, 依赖于编译器的优化选项 
  19.     依赖变量越界访问达成变量的存取, 在Release模式下会和Debug模式下的运行效果不相同. 
  20.     运行结果肯定不对了. 是否报错,要看运气了. 如果不报错, 发布后会死的很惨 
  21. */  
  22.   
  23. int main(int argc, char* argv[]) {  
  24.       
  25.     /// 将函数模板特化的数组大小, 从1填到9来测试  
  26.     /// 不能直接在一个作用域内写多个函数模板的实例, 会全被替换成最后一个函数模板的实例  
  27.     fnTestDataType<9>();  
  28.     printf(""); //< bp  
  29.   
  30.     /** IDE debug 变量内存地址分析 
  31.     ============================================================ 
  32.     char array size = 9 
  33.     ------------------------------------------------------------ 
  34.     &szBuf[0] =     0x0018FEE8 
  35.     &szBuf[8] =     0x0018FEF0 
  36.     &wTmp =         0x0018FEE4 
  37.     &iTmp =         0x0018FEE0 
  38.     &lTmp =         0x0018FEDC 
  39.     &f =            0x0018FED8 
  40.     &dbl =          0x0018FED0 
  41.     &szBuf1[0] =    0x0018FEC4 
  42.     &szBuf1[8] =    0x0018FECC 
  43.     &wTmp1 =        0x0018FEC0 
  44.     &iTmp1 =        0x0018FEBC 
  45.     &lTmp1 =        0x0018FEB8 
  46.     &f1 =           0x0018FEB4 
  47.     &dbl1 =         0x0018FEAC 
  48.      
  49.     ============================================================ 
  50.     char array size = 8 
  51.     ------------------------------------------------------------ 
  52.     &szBuf[0] =     0x0018FEEC 
  53.     &szBuf[7] =     0x0018FEF3 
  54.     &wTmp =         0x0018FEE8 
  55.     &iTmp =         0x0018FEE4 
  56.     &lTmp =         0x0018FEE0 
  57.     &f =            0x0018FEDC 
  58.     &dbl =          0x0018FED4 
  59.     &szBuf1[0] =    0x0018FECC 
  60.     &szBuf1[7] =    0x0018FED3 
  61.     &wTmp1 =        0x0018FEC8 
  62.     &iTmp1 =        0x0018FEC4 
  63.     &lTmp1 =        0x0018FEC0 
  64.     &f1 =           0x0018FEBC 
  65.     &dbl1 =         0x0018FEB4 
  66.      
  67.     ============================================================ 
  68.     char array size = 7 
  69.     ------------------------------------------------------------ 
  70.     &szBuf[0] =     0x0018FEEC 
  71.     &szBuf[6] =     0x0018FEF2 
  72.     &wTmp =         0x0018FEE8 
  73.     &iTmp =         0x0018FEE4 
  74.     &lTmp =         0x0018FEE0 
  75.     &f =            0x0018FEDC 
  76.     &dbl =          0x0018FED4 
  77.     &szBuf1[0] =    0x0018FECC 
  78.     &szBuf1[6] =    0x0018FED2 
  79.     &wTmp1 =        0x0018FEC8 
  80.     &iTmp1 =        0x0018FEC4 
  81.     &lTmp1 =        0x0018FEC0 
  82.     &f1 =           0x0018FEBC 
  83.     &dbl1 =         0x0018FEB4 
  84.      
  85.     ============================================================ 
  86.     char array size = 6 
  87.     ------------------------------------------------------------ 
  88.     &szBuf[0] =     0x0018FEEC 
  89.     &szBuf[5] =     0x0018FEF1 
  90.     &wTmp =         0x0018FEE8 
  91.     &iTmp =         0x0018FEE4 
  92.     &lTmp =         0x0018FEE0 
  93.     &f =            0x0018FEDC 
  94.     &dbl =          0x0018FED4 
  95.     &szBuf1[0] =    0x0018FECC 
  96.     &szBuf1[5] =    0x0018FED1 
  97.     &wTmp1 =        0x0018FEC8 
  98.     &iTmp1 =        0x0018FEC4 
  99.     &lTmp1 =        0x0018FEC0 
  100.     &f1 =           0x0018FEBC 
  101.     &dbl1 =         0x0018FEB4 
  102.      
  103.     ============================================================ 
  104.     char array size = 5 
  105.     ------------------------------------------------------------ 
  106.     &szBuf[0] =     0x0018FEEC 
  107.     &szBuf[4] =     0x0018FEF0 
  108.     &wTmp =         0x0018FEE8 
  109.     &iTmp =         0x0018FEE4 
  110.     &lTmp =         0x0018FEE0 
  111.     &f =            0x0018FEDC 
  112.     &dbl =          0x0018FED4 
  113.     &szBuf1[0] =    0x0018FECC 
  114.     &szBuf1[4] =    0x0018FED0 
  115.     &wTmp1 =        0x0018FEC8 
  116.     &iTmp1 =        0x0018FEC4 
  117.     &lTmp1 =        0x0018FEC0 
  118.     &f1 =           0x0018FEBC 
  119.     &dbl1 =         0x0018FEB4 
  120.      
  121.     ============================================================ 
  122.     char array size = 4 
  123.     ------------------------------------------------------------ 
  124.     &szBuf[0] =     0x0018FEF0 
  125.     &szBuf[3] =     0x0018FEF3 
  126.     &wTmp =         0x0018FEEC 
  127.     &iTmp =         0x0018FEE8 
  128.     &lTmp =         0x0018FEE4 
  129.     &f =            0x0018FEE0 
  130.     &dbl =          0x0018FED8 
  131.     &szBuf1[0] =    0x0018FED4 
  132.     &szBuf1[3] =    0x0018FED7 
  133.     &wTmp1 =        0x0018FED0 
  134.     &iTmp1 =        0x0018FECC 
  135.     &lTmp1 =        0x0018FEC8 
  136.     &f1 =           0x0018FEC4 
  137.     &dbl1 =         0x0018FEBC 
  138.      
  139.     ============================================================ 
  140.     char array size = 3 
  141.     ------------------------------------------------------------ 
  142.     &szBuf[0] =     0x0018FEF0 
  143.     &szBuf[2] =     0x0018FEF2 
  144.     &wTmp =         0x0018FEEC 
  145.     &iTmp =         0x0018FEE8 
  146.     &lTmp =         0x0018FEE4 
  147.     &f =            0x0018FEE0 
  148.     &dbl =          0x0018FED8 
  149.     &szBuf1[0] =    0x0018FED4 
  150.     &szBuf1[2] =    0x0018FED6 
  151.     &wTmp1 =        0x0018FED0 
  152.     &iTmp1 =        0x0018FECC 
  153.     &lTmp1 =        0x0018FEC8 
  154.     &f1 =           0x0018FEC4 
  155.     &dbl1 =         0x0018FEBC 
  156.      
  157.     ============================================================ 
  158.     char array size = 2 
  159.     ------------------------------------------------------------ 
  160.     &szBuf[0] =     0x0018FEF0 
  161.     &szBuf[1] =     0x0018FEF1 
  162.     &wTmp =         0x0018FEEC 
  163.     &iTmp =         0x0018FEE8 
  164.     &lTmp =         0x0018FEE4 
  165.     &f =            0x0018FEE0 
  166.     &dbl =          0x0018FED8 
  167.     &szBuf1[0] =    0x0018FED4 
  168.     &szBuf1[1] =    0x0018FED5 
  169.     &wTmp1 =        0x0018FED0 
  170.     &iTmp1 =        0x0018FECC 
  171.     &lTmp1 =        0x0018FEC8 
  172.     &f1 =           0x0018FEC4 
  173.     &dbl1 =         0x0018FEBC 
  174.      
  175.     ============================================================ 
  176.     char array size = 1 
  177.     ------------------------------------------------------------ 
  178.     &szBuf[0] =     0x0018FEF0 
  179.     &szBuf[0] =     0x0018FEF0 
  180.     &wTmp =         0x0018FEEC 
  181.     &iTmp =         0x0018FEE8 
  182.     &lTmp =         0x0018FEE4 
  183.     &f =            0x0018FEE0 
  184.     &dbl =          0x0018FED8 
  185.     &szBuf1[0] =    0x0018FED4 
  186.     &szBuf1[0] =    0x0018FED4 
  187.     &wTmp1 =        0x0018FED0 
  188.     &iTmp1 =        0x0018FECC 
  189.     &lTmp1 =        0x0018FEC8 
  190.     &f1 =           0x0018FEC4 
  191.     &dbl1 =         0x0018FEBC 
  192.     */  
  193.   
  194.     printf("END, press any key to quit\n");  
  195.     return 0;  
  196. }  

http://blog.csdn.net/lostspeed/article/details/50569619

以上是关于DEBUG模式下, 内存中的变量地址分析的主要内容,如果未能解决你的问题,请参考以下文章

在VS2017中局部变量的内存地址分配

visual studio c/c++变量内存地址里的cc是什么意思?

java设计模式精讲 Debug 方式+内存分析 高清无密

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | dvmDexFileOpenPartial | dexFileParse | 脱壳点 | 获取 dex 文件在内存中的首地址 )(代码片

[debug] 解决在C++编写过程中的“找到一个或多个多重定义的符号”

java设计模式精讲 Debug 方式+内存分析