memset()是一个来自于string库的函数,正规用法是初始化char类型的数组。因为char类型只占1个字节,memset按字节赋值后,会将char类型数组的所有元素变为你指定的值。但是4字节的int类型在被memset赋值后,会被重复四次:如使用memset赋值1到int数组后,1转为二进制的一个字节为00000001,赋值完成后为00000001000000010000000100000001,即十进制的16843009。因此不能直接对int数组memset赋值目标值。也因此,将数组赋值为0可以正常使用

还有一个应用是,对一个int数组使用memset( , 0xff, sizeof());时,赋值完成后每个元素为11111111111111111111111111111111,即-1。

除了赋值0或-1外,有时也需要将数组初始化为极大值。下面是几个常用的赋值。

memset(arr, 0x7f, sizeof(arr)); //set int to 2139062143
memset(arr, 0x80, sizeof(arr)); //set int to -2139062144
memset(arr, 0x7f, sizeof(arr)); //set double to 1.38242e+306
memset(arr, 0xfe, sizeof(arr)); //set double to -5.31401e+303

注意,由于上面的赋值接近了数据类型的上限,在极大值相加(如最短路算法有时会出现)时会出现溢出

这里推荐一个比较合适的常量:0x3f3f3f3f,转换为十进制仍达到1061109567,为109级别,正常情况下不会小于正常常数值。而0x3f3f3f3f * 2 = 2122219134‬,仍没有超过int类型的上限232。而且,由于0x3f3f3f3f的每个字节均相同,在memset时直接使用

memset(arr, 0x3f, sizeof(arr));

即可完成最短路算法中常用的极大值初始化。

使用memset初始化int数组的更多相关文章

  1. memset为int型数组初始化问题

    头文件:#include <string.h>memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为:    void * memset( void * ptr, int ...

  2. c/c++ int数组初始化/重置为0

    1.int数组其实初始化的时候默认就是全部为0 int a[1000];int a[1000] = {0}; 以上2种写法其实都可以 注意:int a[1000] = {0};这种方法如果想把整形数组 ...

  3. memset 初始化数组 & 实现原理

    初始化数组可不必使用n重for循环. 原理 memset具有初始化数组的功能,能够初始化数组中的每一个值. 它是将数组中的每一个数的二进制的每一个字节初始化的. 比如初始化int类型的a数组:mems ...

  4. 为什么memset不能将数组元素初始化为1?

    原型:extern void *memset(void *buffer, int c, int count); 功能:把buffer所指内存区域的前count个字节设置成字符c. 包含头文件:< ...

  5. 个人理解的int数组和char数组

    char数组中不论是一维还是二维的,在程序执行时每一块的分离依据都是以提供的起始地址到'\0'为一个处理的字符串.所以关于char[]的函数都是只提供相应起始地址作为形参就可以. char[]互相交换 ...

  6. java对一个int数组进行排序、去重

    思路: 1.使用 HashSet 进行去重 2.将 HashSet 变为 TreeSet 3.使用 TreeSet 进行排序 4.将 Set 变为 Integer 数组 5.将 Integer 数组变 ...

  7. C语言的未初始化的数组的值为什么是随机的

    突然想起来前几天同学问我为什么没有初始化的数组的值是随机的,发现这个困惑自己也是存在的,所以自己总结的心得. 1. 首先,并不是所有未初始化的数组的值都是随机的.对于没有初始化的数组,分两种情况: ( ...

  8. 2019-8-31-dotnet-core-用值初始化整个数组

    title author date CreateTime categories dotnet core 用值初始化整个数组 lindexi 2019-08-31 16:55:58 +0800 2019 ...

  9. int数组转string数组和int数组转string中间用逗号隔开

    //int 数组转string数组 ,,,}; string result=test.Select(i => i.ToString()).ToArray(); //int 数组转 string中 ...

随机推荐

  1. windows下 python 如何安装pygame模块

    本机系统:win7,Pyhon版本: 3.6.0 1. 安装下载python官网 https://www.python.org/ 下载地址 https://www.python.org/downloa ...

  2. MongoDB 学习笔记之 $push,$each,$slice组合使用

    $push使用: 使用$push给数组添加2个新成员 db.ArrayTest.updateOne({ "name" : "Bill"},{$push: {&q ...

  3. MongoDB 学习笔记之 Aggregation Pipeline实战实现inner join

     Aggregation Pipeline实战实现inner join: leftT集合: comments集合: 现在我们要用aggregation实现inner join db.comments. ...

  4. 03 python基础作业(一)

    1.将['alex','eric',’rain’]用下划线拼接成字符串.(['alex','eric',123]呢?) li=['alex','eric','rain'] v='_'.join(li) ...

  5. .NetCore WebApi —— Swagger版本控制

    目录: .NetCore WebApi——Swagger简单配置 .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger) .NetCore WebApi —— Swagge ...

  6. 不依赖远程API启动SEER区块链命令行钱包和网页钱包的方法

    不依赖远程API启动命令行钱包和网页钱包的方法 在SEER的见证人操作等需要使用命令行钱包的操作中,我们介绍了通过钱包连接远程API来和区块链交互的方法.类似这样: cli_wallet.exe -s ...

  7. vue中methods,computed,filters,watch的总结

    08.28自我总结 vue中methods,computed,filters,watch的总结 一.methods methods属性里面的方法会在数据发生变化的时候你,只要引用了此里面分方法,方法就 ...

  8. Codeforces1141F_Same Sum Blocks

    题意 给定一个序列,求最多的不相交区间满足区间和相同. 分析 从暴力的角度想,是枚举区间再求和,反过来想,直接记录每个和对应是那些区间,然后排个序求最大不相交即可. 代码 #include <b ...

  9. css 块元素超出文字省略表示

    .text-omit{ white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } 只对块元素的设置有效 . 块元素和行内元素见 ...

  10. ThinkPhp3.1.3执行存储过程返回false

    1.Tp在调用存储过程的时候,每次都显示false 返回一大片,下面是我自己的代码.