本帖最后由 jackz007 于 2022-11-26 10:56 编辑
分别用 gcc 和 VC9.0 编译下面的代码,研究一下反汇编代码,看看是否真的有变量的初始化#include <stdio.h>
int main(void)
{
struct node {
int i ;
int * p ;
} dx ;
printf("i = %d\n" , dx . i) ;
printf("p = %p\n" , dx . p) ;
}
【tdm-gcc 5.1.0】:00401350 /$ 55 push ebp main() 入口
00401351 |. 89E5 mov ebp, esp
00401353 |. 83E4 F0 and esp, FFFFFFF0
00401356 |. 83EC 20 sub esp, 20 <--- 堆栈分配 0x20 字节供局部变量使用
00401359 |. E8 E2050000 call 00401940
0040135E |. 8B4424 18 mov eax, dword ptr [esp+18] <--- dx . i - 直接使用,未经任何初始化
00401362 |. 894424 04 mov dword ptr [esp+4], eax <--- dx . i 入栈,准备显示
00401366 |. C70424 24304000 mov dword ptr [esp], 00403024 ; ||ASCII "i = %d"
0040136D |. E8 3E080000 call <jmp.&msvcrt.printf> ; |\printf()
00401372 |. 8B4424 1C mov eax, dword ptr [esp+1C] <--- dx . p - 直接使用,未经任何初始化
00401376 |. 894424 04 mov dword ptr [esp+4], eax <--- dx . p 入栈,准备显示
0040137A |. C70424 2C304000 mov dword ptr [esp], 0040302C ; |ASCII "p = %p"
00401381 |. E8 2A080000 call <jmp.&msvcrt.printf> ; \printf()
00401386 |. B8 00000000 mov eax, 0
0040138B |. C9 leave
0040138C \. C3 retn
【VC9.0】00401000 /$ 55 push ebp main() 入口
00401001 |. 8BEC mov ebp, esp
00401003 |. 83EC 08 sub esp, 8 <--- 堆栈分配 0x08 字节供局部变量使用
00401006 |. 8B45 F8 mov eax, dword ptr [ebp-8] dx . i - 直接使用,未经任何初始化
00401009 |. 50 push eax <--- dx . i 入栈,准备显示
0040100A |. 68 00C04000 push 0040C000 ; ASCII "i = %d"
0040100F |. E8 1A000000 call 0040102E <--- printf()
00401014 |. 83C4 08 add esp, 8
00401017 |. 8B4D FC mov ecx, dword ptr [ebp-4] <--- dx . p - 直接使用,未经任何初始化
0040101A |. 51 push ecx <--- dx . p 入栈,准备显示
0040101B |. 68 08C04000 push 0040C008 ; ASCII "p = %p"
00401020 |. E8 09000000 call 0040102E <--- printf()
00401025 |. 83C4 08 add esp, 8
00401028 |. 33C0 xor eax, eax
0040102A |. 8BE5 mov esp, ebp
0040102C |. 5D pop ebp
0040102D \. C3 retn
最后结论就是,不要想太多,编译器绝对不会为你初始化任何一个变量 |