DEBUG模式下, 内存中的变量地址分析
测试函数的模板实现
- /// @file my_template.h
- /// @brief 测试数据类型用的模板实现
- #ifndef MY_TEMPLATE_H_2016_0123_1226
- #define MY_TEMPLATE_H_2016_0123_1226
- template<int iArySize>
- void fnTestDataType() {
- char szBuf[iArySize] = {'\0'};
- unsigned short wTmp = 0;
- int iTmp = 0;
- long lTmp = 0;
- float f = .0f;
- double dbl = .0;
- char szBuf1[iArySize] = {'\0'};
- unsigned short wTmp1 = 0;
- int iTmp1 = 0;
- long lTmp1 = 0;
- float f1 = .0f;
- double dbl1 = .0;
- printf("============================================================\n");
- printf("char array size = %d\n", iArySize);
- printf("------------------------------------------------------------\n");
- printf("&szBuf[0] = \t0x%p\n", &szBuf[0]);
- printf("&szBuf[%d] = \t0x%p\n", iArySize - 1, &szBuf[iArySize - 1]);
- printf("&wTmp = \t0x%p\n", &wTmp);
- printf("&iTmp = \t0x%p\n", &iTmp);
- printf("&lTmp = \t0x%p\n", &lTmp);
- printf("&f = \t\t0x%p\n", &f);
- printf("&dbl = \t\t0x%p\n", &dbl);
- printf("&szBuf1[0] = \t0x%p\n", &szBuf1[0]);
- printf("&szBuf1[%d] = \t0x%p\n", iArySize - 1, &szBuf1[iArySize - 1]);
- printf("&wTmp1 = \t0x%p\n", &wTmp1);
- printf("&iTmp1 = \t0x%p\n", &iTmp1);
- printf("&lTmp1 = \t0x%p\n", &lTmp1);
- printf("&f1 = \t\t0x%p\n", &f1);
- printf("&dbl1 = \t0x%p\n\n", &dbl1);
- };
- #endif // #ifndef MY_TEMPLATE_H_2016_0123_1226
测试代码和实验结论
- /// @file main.cpp
- /// @brief DEBUG模式下, 内存中的变量地址分析
- #include <iostream>
- using namespace std;
- #include "my_template.h"
- /** 试验结论 - <<DEBUG模式下, 内存中的变量地址分析>>
- 如果定义多个变量
- DEBUG模式下, 内存中的变量地址和定义的顺序相同
- 变量开始地址都是模式地址
- 先定义的变量在内存高地址
- 后定义的变量在内存低地址
- Release模式下, 经过优化, 变量的内存地址和变量定义的顺序不相同!
- 如果变量有越界访问的情况, Release模式下的越界访问情况未知.
- 好像有一些规律, 依赖于编译器的优化选项
- 依赖变量越界访问达成变量的存取, 在Release模式下会和Debug模式下的运行效果不相同.
- 运行结果肯定不对了. 是否报错,要看运气了. 如果不报错, 发布后会死的很惨
- */
- int main(int argc, char* argv[]) {
- /// 将函数模板特化的数组大小, 从1填到9来测试
- /// 不能直接在一个作用域内写多个函数模板的实例, 会全被替换成最后一个函数模板的实例
- fnTestDataType<9>();
- printf(""); //< bp
- /** IDE debug 变量内存地址分析
- ============================================================
- char array size = 9
- ------------------------------------------------------------
- &szBuf[0] = 0x0018FEE8
- &szBuf[8] = 0x0018FEF0
- &wTmp = 0x0018FEE4
- &iTmp = 0x0018FEE0
- &lTmp = 0x0018FEDC
- &f = 0x0018FED8
- &dbl = 0x0018FED0
- &szBuf1[0] = 0x0018FEC4
- &szBuf1[8] = 0x0018FECC
- &wTmp1 = 0x0018FEC0
- &iTmp1 = 0x0018FEBC
- &lTmp1 = 0x0018FEB8
- &f1 = 0x0018FEB4
- &dbl1 = 0x0018FEAC
- ============================================================
- char array size = 8
- ------------------------------------------------------------
- &szBuf[0] = 0x0018FEEC
- &szBuf[7] = 0x0018FEF3
- &wTmp = 0x0018FEE8
- &iTmp = 0x0018FEE4
- &lTmp = 0x0018FEE0
- &f = 0x0018FEDC
- &dbl = 0x0018FED4
- &szBuf1[0] = 0x0018FECC
- &szBuf1[7] = 0x0018FED3
- &wTmp1 = 0x0018FEC8
- &iTmp1 = 0x0018FEC4
- &lTmp1 = 0x0018FEC0
- &f1 = 0x0018FEBC
- &dbl1 = 0x0018FEB4
- ============================================================
- char array size = 7
- ------------------------------------------------------------
- &szBuf[0] = 0x0018FEEC
- &szBuf[6] = 0x0018FEF2
- &wTmp = 0x0018FEE8
- &iTmp = 0x0018FEE4
- &lTmp = 0x0018FEE0
- &f = 0x0018FEDC
- &dbl = 0x0018FED4
- &szBuf1[0] = 0x0018FECC
- &szBuf1[6] = 0x0018FED2
- &wTmp1 = 0x0018FEC8
- &iTmp1 = 0x0018FEC4
- &lTmp1 = 0x0018FEC0
- &f1 = 0x0018FEBC
- &dbl1 = 0x0018FEB4
- ============================================================
- char array size = 6
- ------------------------------------------------------------
- &szBuf[0] = 0x0018FEEC
- &szBuf[5] = 0x0018FEF1
- &wTmp = 0x0018FEE8
- &iTmp = 0x0018FEE4
- &lTmp = 0x0018FEE0
- &f = 0x0018FEDC
- &dbl = 0x0018FED4
- &szBuf1[0] = 0x0018FECC
- &szBuf1[5] = 0x0018FED1
- &wTmp1 = 0x0018FEC8
- &iTmp1 = 0x0018FEC4
- &lTmp1 = 0x0018FEC0
- &f1 = 0x0018FEBC
- &dbl1 = 0x0018FEB4
- ============================================================
- char array size = 5
- ------------------------------------------------------------
- &szBuf[0] = 0x0018FEEC
- &szBuf[4] = 0x0018FEF0
- &wTmp = 0x0018FEE8
- &iTmp = 0x0018FEE4
- &lTmp = 0x0018FEE0
- &f = 0x0018FEDC
- &dbl = 0x0018FED4
- &szBuf1[0] = 0x0018FECC
- &szBuf1[4] = 0x0018FED0
- &wTmp1 = 0x0018FEC8
- &iTmp1 = 0x0018FEC4
- &lTmp1 = 0x0018FEC0
- &f1 = 0x0018FEBC
- &dbl1 = 0x0018FEB4
- ============================================================
- char array size = 4
- ------------------------------------------------------------
- &szBuf[0] = 0x0018FEF0
- &szBuf[3] = 0x0018FEF3
- &wTmp = 0x0018FEEC
- &iTmp = 0x0018FEE8
- &lTmp = 0x0018FEE4
- &f = 0x0018FEE0
- &dbl = 0x0018FED8
- &szBuf1[0] = 0x0018FED4
- &szBuf1[3] = 0x0018FED7
- &wTmp1 = 0x0018FED0
- &iTmp1 = 0x0018FECC
- &lTmp1 = 0x0018FEC8
- &f1 = 0x0018FEC4
- &dbl1 = 0x0018FEBC
- ============================================================
- char array size = 3
- ------------------------------------------------------------
- &szBuf[0] = 0x0018FEF0
- &szBuf[2] = 0x0018FEF2
- &wTmp = 0x0018FEEC
- &iTmp = 0x0018FEE8
- &lTmp = 0x0018FEE4
- &f = 0x0018FEE0
- &dbl = 0x0018FED8
- &szBuf1[0] = 0x0018FED4
- &szBuf1[2] = 0x0018FED6
- &wTmp1 = 0x0018FED0
- &iTmp1 = 0x0018FECC
- &lTmp1 = 0x0018FEC8
- &f1 = 0x0018FEC4
- &dbl1 = 0x0018FEBC
- ============================================================
- char array size = 2
- ------------------------------------------------------------
- &szBuf[0] = 0x0018FEF0
- &szBuf[1] = 0x0018FEF1
- &wTmp = 0x0018FEEC
- &iTmp = 0x0018FEE8
- &lTmp = 0x0018FEE4
- &f = 0x0018FEE0
- &dbl = 0x0018FED8
- &szBuf1[0] = 0x0018FED4
- &szBuf1[1] = 0x0018FED5
- &wTmp1 = 0x0018FED0
- &iTmp1 = 0x0018FECC
- &lTmp1 = 0x0018FEC8
- &f1 = 0x0018FEC4
- &dbl1 = 0x0018FEBC
- ============================================================
- char array size = 1
- ------------------------------------------------------------
- &szBuf[0] = 0x0018FEF0
- &szBuf[0] = 0x0018FEF0
- &wTmp = 0x0018FEEC
- &iTmp = 0x0018FEE8
- &lTmp = 0x0018FEE4
- &f = 0x0018FEE0
- &dbl = 0x0018FED8
- &szBuf1[0] = 0x0018FED4
- &szBuf1[0] = 0x0018FED4
- &wTmp1 = 0x0018FED0
- &iTmp1 = 0x0018FECC
- &lTmp1 = 0x0018FEC8
- &f1 = 0x0018FEC4
- &dbl1 = 0x0018FEBC
- */
- printf("END, press any key to quit\n");
- return 0;
- }
http://blog.csdn.net/lostspeed/article/details/50569619
DEBUG模式下, 内存中的变量地址分析的更多相关文章
- eclipse在debug模式下鼠标移动到变量上不显示值的问题
在eclipse中调试时,鼠标移动到变量上不显示值,使用ctrl+shift+i,或者通过配置达到目的: Window->Preferences->Java->Editor-> ...
- 引入 Tinker 之后如何在 Debug 模式下开启 Instant Run
在<Tinker + Bugly + Jenkins 爬坑之路>一文中讲了在接入 Tinker 之后,Jenkins 中的一些坑,由此,热修复算告一段落,但是,在直接 Run 模式运行时, ...
- Debug模式下编译溢出问题
问题: 代码在Debug模式下编译报出内存溢出的错误,而Release模式下则没有. 由于Debug模式下包含调试信息,并且不作任何优化.而Release模式进行了各种优化,内存检测等操作均省去,使得 ...
- C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call问题。
今天遇到一个Access Violation的crash,只看crash call stack没有找到更多的线索,于是在debug模式下又跑了一遍,遇到了如下的一个debug的错误提示框: 这个是什么 ...
- Mach-O在内存中符号表地址、字符串表地址的计算
KSCrash 是一个用于 iOS 平台的崩溃捕捉框架,最近读了其部分源码,在 KSDynamicLinker 文件中有一个函数,代码如下: /** Get the segment base addr ...
- 重写NSLog,Debug模式下打印日志和当前行数
在pch文件中加入以下命令,NSLog在真机测试中就不会打印了 //重写NSLog,Debug模式下打印日志和当前行数 #if DEBUG #define NSLog(FORMAT, ...) fpr ...
- Intellij IDEA debug模式下项目启动慢/无法启动的事件解决过程记录
项目无法启动了 简单的介绍一下事件过程:周一的早上,收到前端同事抛过来的一个任务,说是一个接口无法正常返回数据,于是就让他把参数发过来,我想试着在本地重现一下并且将问题修复掉,这种情况肯定是要通过de ...
- Myeclipse在debug模式下没加断点程序卡住,start模式下可以正常启动
参考<eclipse在debug模式下卡住,start模式下可以启动>,地址:https://blog.csdn.net/jack_chen1994/article/details/761 ...
- eclipse的debug模式下启动不了tomcat
使用eclipse启动tomcat,正常模式下可以启动tomcat,却在debug模式下无法启动tomcat. 这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动to ...
随机推荐
- jsp小商城
一个小商城,当然,没淘宝那么厉害,只是那时学完j2ee后,发现java原来也可以做网站,学了数据库,servlet,jsp,当时是很惊喜的,可以直接做个这样的东西.而放到今天,学了更多之后,发现可以用 ...
- DOM操作HTML文档
概述 之前写过一些关于DOM方法的知识,理论方法的偏多,所以,这篇博客主要是实践方面的Demo,如果,大家觉得理论方面有所欠缺,大家可以看看这几篇博客:JavaScript总结(一.基本概念)和Jav ...
- 安卓Launcher之获取手机安装的应用列表,安卓launcher
Launcher中最主要的就是获取所有应用列表的入口以及图标,一般获取的方法有两种: PackageInfo ResolveInfo 运行获取所有APP的Launcher并且允许进行点击事件,进入到应 ...
- C#委托好处知多少
1.性能 性能是泛型的一个主要优点. 直接上例子,通过实例可以让我们很好的理解这一点. Stopwatch stopwatch = new Stopwatch(); stopwatch.Start() ...
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...
- 2-SAT 及 一点习题
今天简单学习了一下2-SAT.现在简单地总结一下.至于定义之类的就不写了,这里就写写做法,以防以后忘记. 构图 每个值a,拆为两个点,一个表示a,一个表示^a(非a).每个点我们可以看成是一个命题(这 ...
- (csdn高校俱乐部编程挑战)2的补码
题目详情 在计算机中,整数是以2的补码的形式给出的. 给出整数A和B,如果计算机是32位机.求从A到B之间的全部二进制数中,一共用了多少个1. 输入格式: 多组数据,每组数据一行,由两个整数A,B, ...
- 基于JSP+SERVLET的新闻发布系统(三)
拖了这么久..今天把栏目管理还有新闻管理模块的也挂出来.. 栏目管理跟用户管理一样. 这里重点讲解新闻管理. 效果图如上: 1,可选择栏目类别,且栏目类别是动态生成的. 默认生成的文章是未审核状态的. ...
- android的fragments管理
FragmentManager 为了管理Activity中的fragments,需要使用FragmentManager. 为了得到它,需要调用Activity中的getFragmentManager( ...
- 嵌入式MCU开发群资源
STM32CubeMX是一款图形化软件设置工具,允许使用图形化向导来生成C初始化代码.它是未来开发stm32系列产品的主流软件,是ST公司的主动原创,可以减轻开发工作,时间和费用.STM32Cube ...