批量初始化数组和memset函数
对于数组的初始化有一下三种方式:
int a[]={1,2,3,4,5} //通过判断初始化值得个数来却仍数组长度
int b[5]={1,2,3} //数组长度为5,可是初始值却只有三个,因此,不足的初始值需要使用么人值初始化,即b[0]=1,b[2]=3,b[3]=b[4]=0;
int c[5]={0};//这个效果是数组所有元素值都初始化为0了,可是并不是这样写就是全部初始化为相同的给定值,之所以会全部为0是因为,数组长度为5,却只提供一个初始值,因此后面四个元素要用默认值来初始化,对于整形来说,默认值是0,这才造成全部初始化为0的局面
关键点来了,要想批量初始化数组为整形1,可不可以呢?
int int_array[5]={1} ;//答案是否定的,这种形式只是把int_array[0]=1,而剩下元素值全部默认初始化为0了
这时候我们会想到memset函数长迎来初始化字符数组为0的场景,那么memset能不能把整形数组初始化为1呢?
别急着回答,先来回顾一个memset的知识
memset:char型初始化函数
头文件:<string.h> 或 <memory.h>
函数原型:void *memset(void *s , int ch , size_t n )
memset(结构体/数组名 , 用于替换的ASCII码对应字符 , 前n个字符 );
memset(结构体/数组名 , "用于替换的字符“ , 前n个字符 );
函数解释:将s中的前n个字节用ch替换并且返回s
看完这些是不是还不确定答案呢?
那么告诉你这总方法不可行,你会不会大吃一惊!!
细细道来:注意这句话 将s中的前n个字节用ch替换并且返回s 它的意思是对于每个字节,都用给定的第二个参数值初始化,而初始化多少个字节取决于第三个参数
对于char型数组来说,每个char数组元素都占用一个字节,那么第二个参数只要是很乏的byte值,都会实现批量初始化效果
但是对于整形数组来说,int占4个字节(sizeof函数求得,每个编译器估计有些不一样),那么当我们执行下列语句
int int_array[5];
memset(int_array,1,sizeof(int)*5)
输出来的结果会让你大吃一惊
根据解释,int是四个字节,而memset是对每个字节都赋值为第二个参数值,其结果就是int_array[0]的内部二进制码表示0x01 0x01 0x01 0x01 转换成10进制肯定不是1了?
那么是不是memset只能对char型数组进行批量清0呢?
其实不是,对于其他类型的数组,只要是初始化为0或者-1 ,结果都是正确的这是因为 0x00 0x00 0x00 0x00 10进制结果仍然是0
0xff 0xff 0xff 0xff 10进制结果仍然是-1
结论:对于非字符型数组进行批量赋值是不可能的,只能用循环实现一个个元素赋值
但是当涉及到把素组元素全部初始化为0时,无论是用memset还是{0}都可以做到,其中的原理上面说的很清楚啦!!!
批量初始化数组和memset函数的更多相关文章
- c++ 批量初始化数组 fill和fill_n函数的应用
转自c++ 如何批量初始化数组 fill和fill_n函数的应用 std::fill(a+,a+,0x3f3f3f3f);///从下标2到下标10 前闭后开 共8个 std::fill_n(a+,,0 ...
- 【转】c++ 如何批量初始化数组 fill和fill_n函数的应用
http://blog.csdn.net/sunquana/article/details/9153213 一. fill和fill_n函数的应用: fill函数的作用是:将一个区间的元素都赋予val ...
- C++定义和初始化数组以及memset的使用(转)
一.一维数组 静态 int array[100]; 定义了数组array,并未对数组进行初始化 静态 int array[100] = {1,2}: 定义并初始化了数组array 动态 int* ar ...
- memset函数及其用法,C语言memset函数详解
在前面不止一次说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”. 每种类型的变量都有各自的 ...
- 关于数组的初始化memset函数
关于数组的初始化memset函数 其实memset复制时按bit8个8个的赋值,有兴趣的可以自己百度.
- [转载]C++二维动态数组memset()函数初始化
来源:https://blog.csdn.net/longhopefor/article/details/20994919 先说说memset函数: void *memset(void *s,int ...
- C语言中的memset函数和数组指针
代码: #include <iostream> #include <cstring> using namespace std; int main(){ ] = {}; mems ...
- memset初始化数组的问题
今天才搞清楚,memset用于初始化数组,仅能初始化为0值,而不能初始化一个特定的值,这怎么能模糊了呢??? 因此,如果对申请的一段存放数组的内存进行初始化,每个数组元素均初始化为特定的值,必须使用循 ...
- memset初始化数组的坑
memset函数常被我们用来初始化数组,然而有个坑可能会被我们踩到. 静态数组初始化 一般情形是这样的: #include <cstring> int main() { // 静态数组ar ...
随机推荐
- Windows10 版本说明 From wiki 20190104
Windows版本说明 文字版本的: PC版本历史[编辑] 索引: 旧版本 旧版本,受支援 最新版本 最新预览版本 Version 1507(Windo ...
- [转帖]win10 .Net Runtime Optimization Service占用大量CPU资源解决方法
win10 .Net Runtime Optimization Service占用大量CPU资源解决方法 https://blog.csdn.net/cwg2552298/article/detail ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 3. 循环
在前面的教程中,咪博士留了一道练习题给大家—-画正方形,相信聪明的你应该已经画出来了. 下面是咪博士实现的代码. 是不是跟你的代码很像呢? import turtle turtle.forward(2 ...
- 【设计模式】—— 创建者模式Builder
前言:[模式总览]——————————by xingoo 模式意图 一个对象的创建十分复杂,为了区分构建过程和使用过程,因此分开.使用一个Director类进行对象的创建,Builder规定了这个创建 ...
- 【codevs1690】开关灯 (线段树 区间修改+区间求和 (标记))
[codevs1690]开关灯 2014年2月15日4930 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的 ...
- 【刷题】洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)
洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...
- ueditor的上传文件漏洞(c#)
项目中使用了ueditor,安全测试发现一个漏洞,涉及漏洞的文件名字为UploadHandler.cs,其中有一个方法: private bool CheckFileType(string filen ...
- 异步IO的并发能力:backlog的配置很重要
今天中午正准备完工的时候,发现一个让人抓狂的问题. 一个精简版的AIO应用理论上应该比一个完整版的AIO应用并发能力高一些(因为完整版的事务处理复杂一些),在同一台机器上测试. 但测试结果显示,精简版 ...
- 界面编程之QT的Socket通信20180730
/*******************************************************************************************/ 一.linu ...