当前位置: 代码迷 >> 综合 >> memset()函数的使用详解
  详细解决方案

memset()函数的使用详解

热度:30   发布时间:2024-01-20 21:32:58.0

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