免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3402 | 回复: 2
打印 上一主题 下一主题

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

论坛徽章:
1
15-16赛季CBA联赛之山东
日期:2017-07-04 22:31:26
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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,编译器只是将其作为一个空指针?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2017-07-10 16:56 |只看该作者
不知道是不是编译器的“简写”形式,一般都是word ptr [ bp - CONST ] 的样子。
估计在展示的时候直接换成(局部)变量名了。

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

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP