博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memset()函数的使用详解
阅读量:4046 次
发布时间:2019-05-25

本文共 1151 字,大约阅读时间需要 3 分钟。

memset()是string.h头文件中的函数

作用是在一段内存块填充某个给定的,它是对较大的或进行清零操作的一种最快方法

注意:

1.memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)

比如:int a[5];

 memset(a,1,sizeof(a));

因为1的二进制码为00000000 00000000 00000000 00000001   只要其中的后八位(00000001)

所以数组中每个元素的四个字节都会被赋值为(00000001)

其结果就是 00000001 00000001 00000001 00000001  

所以数组中每个元素的值都会是    1*pow(2,24)+1*pow(2,16)+1*pow(2,8)+1*pow(2,0)=16843009;

2.第二:memset(void *s, int ch,size_t n);中ch实际范围应该在0~~255,因为该函数只能取ch的后八位赋值给你所输入的范围的每个字节

比如:int a[5];

memset(a,-1,sizeof(a))与  memset(a,511,sizeof(a)) 所赋值的结果是一样的都为-1;

因为 -1的二进制码为(11111111 11111111 11111111 11111111)

      511的二进制码为(00000000 00000000 00000001 11111111)

后八位都为(11111111),所以数组中每个字节,如a[0]元素的四个字节都被赋值为(11111111)

其结果为a[0](11111111 11111111 11111111 11111111),即a[0]=-1

因此无论ch多大只有后八位二进制有效,而后八位二进制的范围在(0~255)中改。

而对字符数组操作时则取后八位赋值给字符数组,其八位值作为ASCII码。

 

#include
#include
int main(){ int a[7]; int i; memset(a,0,sizeof(a)); for(i=0;i<7;i++) { printf("%d ",a[i]); } printf("\n\n"); memset(a,1,sizeof(a)); for(i=0;i<7;i++) { printf("%d ",a[i]); } return 0; }
结果:0  0  0  0  0  0  0  16843009  16843009  16843009  16843009  16843009  16843009  16843009  

 

转载地址:http://onzci.baihongyu.com/

你可能感兴趣的文章
一篇文章搞懂 HBase 的 flush 机制和 compact 机制
查看>>
一篇文章搞懂 HBase 的 region 拆分机制
查看>>
HBase 表的预分区是什么?为什么要预分区?如何预分区?
查看>>
Flume 是什么?Flume 有什么特点?
查看>>
一篇文章搞懂 Flume 的架构设计
查看>>
Flume 是怎么保障可靠性的?
查看>>
Flume 怎样实现数据的断点续传?
查看>>
Flume 如何自定义 Mysql Source?
查看>>
Flume 如何自定义 Mysql Sink?
查看>>
Flume 的可靠性级别有哪些?
查看>>
Sqoop 是什么?Sqoop 有什么特点?
查看>>
Sqoop 的使用场景分析
查看>>
DAGScheduler 是什么?有什么作用?
查看>>
DAGScheduler 是如何划分 Stage 的?
查看>>
TaskScheduler 是什么?有什么作用?
查看>>
一篇文章搞懂 DAGScheduler 的调度流程
查看>>
SparkEnv 是什么?有什么作用?
查看>>
SparkConf 是什么?有什么作用?
查看>>
SecurityManager 是什么?有什么作用?
查看>>
如何理解 Java 的线程中断机制?
查看>>