memset

1、原型:

void *memset(void *s, int ch, size_t n);

函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

2、memset是以字节为单位,初始化内存块。

当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如,

char data[10];  
memset(data, 1, sizeof(data));    // right  
memset(data, 0, sizeof(data));    // right   

而在初始化其他基础类型时,则需要注意,比如,

int data[10];  
memset(data, 0, sizeof(data));    // right  
memset(data, -1, sizeof(data));    // right  
memset(data, 1, sizeof(data));    // wrong, data[x] would be 0x01010101 instead of 1  

为什么会出现第4行的错误呢?这是因为:
第一:memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。
第二:memset(void *s, int ch,size_tn);中key实际范围应该在0~~255,因为该函数只能取ch的后八位赋值给你所输入的范围的每个字节,比如int a[5]赋值memset(a,-1,sizeof(int )*5)与memset(a,511,sizeof(int )*5) 所赋值的结果是一样的都为-1;因为-1的二进制码为(11111111 11111111 11111111 11111111)而511的二进制码为(00000000 00000000 00000001 11111111)后八位都为(11111111),所以数组中每个字节,如a[0]含四个字节都被赋值为(11111111),其结果为a[0](11111111 11111111 11111111 11111111),及a[0]=-1。
所以memset(data, 1, sizeof(data));会截取1的后八位进行单个字节的赋值,1的二进制是01,那么将int类型的4字节中每个字节赋值为01,即0x01010101;

参考:
[1] 老生常谈,正确使用memset
[2] 百度百科 memset

猜你喜欢

转载自blog.csdn.net/baidu_35679960/article/details/80364966