字符数组初始化:
测试程序:
#include<iostream>
usingnamespace std;
intmain()
{
char a[10]={65};
return 0;
}
反编译:
5: char a[10]={65};
00401268 mov byte ptr [ebp-0Ch],41h
0040126C xor eax,eax
0040126E mov dword ptr [ebp-0Bh],eax
00401271 mov dword ptr [ebp-7],eax
00401274 mov byte ptr [ebp-3],al
第一条语句是将41h(也即字符’A’的ascii码)赋给内存[ebp-0Ch]区,所以我先查看该区域的内存情况:此时EBP = 0018FF48, ebp-0Ch= 0018FF3C,内存情况:
0018FF32 CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫
然后单步执行,最终内存情况
0018FF3C 41 00 00 00 00 00 00 00 00 00 A.........
结论:若为字符数组初始化,则也会将之后未初始化单元赋值为0。
据此,就可以解释puts(a);能够正常输出,因为之后未初始化部分的值为0,作为字符也即ascii码为0的’\0’,而puts就是输出到’\0’为止。
那么这里就有这样一个问题:若初始化整个字符数组,是否还可以正常输出?
测试程序:
#include<stdio.h>
intmain()
{
char a[5]={65,66,67,68,69};
puts(a);
return 0;
}
输出结果:
ABCDE烫虉
分析:可以看到,出现了乱码,也即不正常输出。所以更加肯定上面的结论!
整型数组初始化:
测试程序:
#include<iostream>
usingnamespace std;
intmain()
{
int array[5]={65};
return 0;
}
反编译:
5: int array[5]={65};
00401268 mov dword ptr [ebp-14h],41h
0040126F xor eax,eax
00401271 mov dword ptr [ebp-10h],eax
00401274 mov dword ptr [ebp-0Ch],eax
00401277 mov dword ptr [ebp-8],eax
0040127A mov dword ptr [ebp-4],eax
第一条语句是将41h(也即字符’A’的ascii码)赋给内存[ebp-14h]区,所以我先查看该区域的内存情况:此时EBP = 0018FF48, ebp-14h=18FF34,内存情况:
0018FF34 CC CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫烫
0018FF40 CC CC CC CC CC CC CC CC 88 FF 18 00 烫烫烫烫....
然后我们单步执行,最后内存情况如下:
0018FF34 41 00 00 00 00 00 00 00 00 00 00 00 A...........
0018FF40 00 00 00 00 00 00 00 00 88 FF 18 00 ............
结论:若初始化整型数组,则系统也会将数组其余的单元都初始化为0
浮点型数组初始化:(float和double都是类似的,这里以double为例)
测试程序:
#include<iostream>
usingnamespace std;
intmain()
{
double a[5]={66};
return 0;
}
反编译:
5: double a[5]={66};
00401268 mov dword ptr [ebp-28h],0
0040126F mov dword ptr [ebp-24h],40508000h
00401276 mov ecx,8
0040127B xor eax,eax
0040127D lea edi,[ebp-20h]
00401280 rep stos dword ptr [edi]
前两条语句语句是将数据66(详情请参考《float型在内存中的存储》)赋给内存[ebp-28h] 和[ebp-24h]区(一个double数据占用8字节空间),所以我先查看该区域的内存情况:此时EBP= 0018FF20, ebp-50h=0018FF38,内存情况:
0018FF20 CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫
0018FF2A CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫
0018FF34 CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫
0018FF3E CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫
然后我们单步执行,最后内存情况如下:
0018FF20 00 00 00 00 00 80 50 40 CC CC ......P@烫
0018FF2A CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫
0018FF34 CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫
0018FF3E CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫
结论:若初始化浮点型数组,则系统不会对其余单元进行任何操作