数组初始化的后续操作

字符数组初始化:

测试程序:

#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  烫烫烫烫烫

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值