数组初始化的后续操作
来源:互联网 发布: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 烫烫烫烫烫
结论:若初始化浮点型数组,则系统不会对其余单元进行任何操作
- 数组初始化的后续操作
- 单链表的后续操作
- 数组的初始化及其相关操作
- java初始化数组操作
- 二叉数组的创建以及后续遍历
- 操作符的重载以及数组/vector对象的初始化
- 二叉树的操作(后续更新)
- 上传完成后的后续操作
- 线程的基本操作(后续补充)
- kali linux的安装以及后续操作
- 关于strlen 和 wstlen_s 操作未初始化的字符数组
- Python Numpy 数组的初始化和基本操作
- Python Numpy 数组的初始化和基本操作
- C#数组-数组的初始化
- 数组,以及数组的初始化
- 数组初始化的位置
- 数组的初始化方式
- 初始化数组的方法
- 进程控制块(PCB)
- UML类图与类的关系详解
- C语言程序
- java接口的应用
- IF
- 数组初始化的后续操作
- JSON转化为Tree
- C++设计模式之十七--Observer观察者模型
- 广州中国进出口商品交易会琶洲展馆 志愿者英语积累
- Mac OS X v10.5.8安装Weblogic 12.1
- 【四圣龙神录】 开源仿东方 弹幕射击游戏教程 官网(译)以及国内参考翻译资料
- EPICS入门与安装
- FZU 2135 && FOJ11月赛D题 模拟题
- (阶段三 dijkstra算法温习1.5)HDU 2680 Choose the best route(使用dijkstra算法求解多源起点的最短路径问题)