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<stdio.h>
#include<string.h>
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