对于数组的初始化有一下三种方式:

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函数的更多相关文章

  1. c++ 批量初始化数组 fill和fill_n函数的应用

    转自c++ 如何批量初始化数组 fill和fill_n函数的应用 std::fill(a+,a+,0x3f3f3f3f);///从下标2到下标10 前闭后开 共8个 std::fill_n(a+,,0 ...

  2. 【转】c++ 如何批量初始化数组 fill和fill_n函数的应用

    http://blog.csdn.net/sunquana/article/details/9153213 一. fill和fill_n函数的应用: fill函数的作用是:将一个区间的元素都赋予val ...

  3. C++定义和初始化数组以及memset的使用(转)

    一.一维数组 静态 int array[100]; 定义了数组array,并未对数组进行初始化 静态 int array[100] = {1,2}: 定义并初始化了数组array 动态 int* ar ...

  4. memset函数及其用法,C语言memset函数详解

    在前面不止一次说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”. 每种类型的变量都有各自的 ...

  5. 关于数组的初始化memset函数

    关于数组的初始化memset函数 其实memset复制时按bit8个8个的赋值,有兴趣的可以自己百度.

  6. [转载]C++二维动态数组memset()函数初始化

    来源:https://blog.csdn.net/longhopefor/article/details/20994919 先说说memset函数: void *memset(void *s,int ...

  7. C语言中的memset函数和数组指针

    代码: #include <iostream> #include <cstring> using namespace std; int main(){ ] = {}; mems ...

  8. memset初始化数组的问题

    今天才搞清楚,memset用于初始化数组,仅能初始化为0值,而不能初始化一个特定的值,这怎么能模糊了呢??? 因此,如果对申请的一段存放数组的内存进行初始化,每个数组元素均初始化为特定的值,必须使用循 ...

  9. memset初始化数组的坑

    memset函数常被我们用来初始化数组,然而有个坑可能会被我们踩到. 静态数组初始化 一般情形是这样的: #include <cstring> int main() { // 静态数组ar ...

随机推荐

  1. Jenkins之自动构建

    修改job的配置: Build periodically:不管版本是否修改,都会执行: Poll SCM:只有当版本有修改才会执行.

  2. js生成hash序列

    炒鸡简单的js生成hash序列的方法.如下: function createHash (hashLength) { if (!hashLength || typeof(Number(hashLengt ...

  3. 等价类计数(Polya定理/Burnside引理)学习笔记

    参考:刘汝佳<算法竞赛入门经典训练指南> 感觉是非常远古的东西了,几乎从来没有看到过需要用这个的题,还是学一发以防翻车. 置换:排列的一一映射.置换乘法相当于函数复合.满足结合律,不满足交 ...

  4. Kangax 的 ES7 兼容性表格

    Kangax 的 ES7 兼容性表格 https://kangax.github.io/compat-table/es2016plus/ Sort by             Engine type ...

  5. BZOJ 2242 [SDOI2011]计算器 | BSGS

    insert的时候忘了取模了-- #include <cstdio> #include <cmath> #include <cstring> #include &l ...

  6. MySql数据库类型bit等与JAVA中的对应类型【布尔类型怎么存】

    用char(1):可以表示字符或者数字,但是不能直接计算同列的值.存储消耗1个字节 用tinyint:只能表示数字,可以直接计算,存储消耗2个字节 用bit: 只能表示0或1,不能计算,存储消耗小于等 ...

  7. websoclet简单示例 my 改

    首先,创建一个 maven war 项目: 首先,pom文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

  8. TensorFlow分布式实践

    大数据时代,基于单机的建模很难满足企业不断增长的数据量级的需求,开发者需要使用分布式的开发方式,在集群上进行建模.而单机和分布式的开发代码有一定的区别,本文就将为开发者们介绍,基于TensorFlow ...

  9. Python 基础数据类型之set

    set是一个无序且不重复的元素集合,相当于字典的键,不重复,不可变 一.set变量初始化 A = set() #注意在创建空集合的时候只能使用s=set(),因为s={}创建的是空字典 B = {&q ...

  10. python BitTornado P2P分发大文件

    P2P分发大文件思路 1.将软件包生成种子文件 2.通过saltstack将种子文件分发至每台服务器 3.每台服务器进行种子下载 推荐使用Twitter开源的murder.Twitter用它来分发大文 ...