忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1338 | 回复: 2

[C] 变量申明是否会分配空间 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之山东
日期:2017-07-04 22:31:26
发表于 2017-07-04 22:21 |显示全部楼层
今天测试的时候遇到一个问题,定义了局部变量a没有赋初值,后面使用变量a的时候程序出了异常。后来写了代码想反汇编看一下只有声明没有定义的局部变量是否会分配内存空间,代码如下,编译环境为vs2008
  1. 001C1ADC  lea         edi,[ebp-0F0h]
  2. 001C1AE2  mov         ecx,3Ch
  3. 001C1AE7  mov         eax,0CCCCCCCCh
  4. 001C1AEC  rep stos    dword ptr es:[edi]
  5. 001C1AEE  mov         byte ptr [ebp-0E9h],0
  6.     int *p = NULL;
  7. 001C1AF5  mov         dword ptr [p],0
  8.     int a = 1;
  9. 001C1AFC  mov         dword ptr [a],1
  10.     int num;

  11.     *p = num;
  12. 001C1B03  cmp         byte ptr [ebp-0E9h],0
  13. 001C1B0A  jne         main+49h (1C1B19h)
  14. 001C1B0C  push        offset  (1C1B37h)
  15. 001C1B11  call        @ILT+175(__RTC_UninitUse) (1C10B4h)
复制代码
对于这段代码我的理解是这样的:在栈上分配了3C个4字节大小的空间,即分配了32个int型的变量,其初值全部为0xCCCCCCCC
1.mov dword ptr [p],0   mov dword ptr [a],1 这两句是将*p和a的值分别设为0和1,那么变量p和a的地址在栈上是如何分配的呢,也就是如何确定p和a对栈底的偏移?
2.将num赋值给*p时判断了cmp byte ptr [ebp-0E9h],0 ,这句话作何解释呢?是不是可以理解为对于没有定义的变量num,编译器只是将其作为一个空指针?

论坛徽章:
17
程序设计版块每日发帖之星
日期:2015-08-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:56黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00程序设计版块每日发帖之星
日期:2016-03-19 06:20:00
发表于 2017-07-10 16:56 |显示全部楼层
不知道是不是编译器的“简写”形式,一般都是word ptr [ bp - CONST ] 的样子。
估计在展示的时候直接换成(局部)变量名了。

第二个猜测跟编译器检测未初始化变量的方法有关系。
如果前面的解释是成立的,估计-0e9不是num的偏移,也许未初始化的赋值直接被编译器给“优化”掉了?

不太熟悉vs的行为,请其他人来回答吧。
PS,可以去网上搜一下__RTC_UninitUse
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP