数组初始化的后续操作

来源:互联网 发布:vb.net数据库实例教程 编辑:程序博客网 时间:2024/04/30 07:41

字符数组初始化:

测试程序:

#include<iostream>usingnamespace std;intmain(){    char a[10]={65};    return 0;}


反编译:

5:        char a[10]={65};00401268   mov        byte ptr [ebp-0Ch],41h0040126C   xor        eax,eax0040126E   mov        dword ptr [ebp-0Bh],eax00401271   mov        dword ptr [ebp-7],eax00401274   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],41h0040126F   xor        eax,eax00401271   mov        dword ptr [ebp-10h],eax00401274   mov        dword ptr [ebp-0Ch],eax00401277   mov        dword ptr [ebp-8],eax0040127A   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],00040126F   mov        dword ptr [ebp-24h],40508000h00401276   mov        ecx,80040127B   xor        eax,eax0040127D   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  烫烫烫烫烫

结论:若初始化浮点型数组,则系统不会对其余单元进行任何操作

 

原创粉丝点击