- 论坛徽章:
- 1
|
今天测试的时候遇到一个问题,定义了局部变量a没有赋初值,后面使用变量a的时候程序出了异常。后来写了代码想反汇编看一下只有声明没有定义的局部变量是否会分配内存空间,代码如下,编译环境为vs2008
- 001C1ADC lea edi,[ebp-0F0h]
- 001C1AE2 mov ecx,3Ch
- 001C1AE7 mov eax,0CCCCCCCCh
- 001C1AEC rep stos dword ptr es:[edi]
- 001C1AEE mov byte ptr [ebp-0E9h],0
- int *p = NULL;
- 001C1AF5 mov dword ptr [p],0
- int a = 1;
- 001C1AFC mov dword ptr [a],1
- int num;
- *p = num;
- 001C1B03 cmp byte ptr [ebp-0E9h],0
- 001C1B0A jne main+49h (1C1B19h)
- 001C1B0C push offset (1C1B37h)
- 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,编译器只是将其作为一个空指针?
|
|