memset函数用法总结(C/C++初始化函数)

使用时需要包含头文件:<memory.h>
函数原型:void *memset(void *s,int ch,size_t n);

函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s
 

值得注意的是:
因为memset函数是按字节来对内存块进行初始化,所以函数原型中的ch的实际范围是在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。
因此无论ch多大只有后八位二进制有效,而后八位二进制的范围在(0~255)中改。而对字符数组操作时则取后八位赋值给字符数组,其八位值作为ASCII码。

所以当它想对int类型数组的元素进行初始化时,只能将其中的元素初始化为0或-1
或者 某些4个字节都相同的数(如16843009等... 因为16843009的二进制形式为:0000 0001 0000 0001 0000 0001 0000 0001,也就是因为该数 4个字节都相同 )。

 

下面用代码来说明:

#include <iostream>
#include <memory.h>
using namespace std;

int main()
{
	int a[4];
	//cout<<sizeof(a);
	
	memset(a, 0, sizeof(a));
	for(int num: a)
	cout<<num<<" ";
	cout<<endl;
	//输出:0 0 0 0

	/*当这里的ch 为255 或者是-1 其实效果都是一样的
    因为255的二进制码(4字节)为:
    0000 0000 1111 1111
    -1的二进制码为(4字节): 
    1111 1111 1111 1111 1111 1111 1111 1111 
    然后该函数只能取ch的后八位赋值给你所输入的范围的每个字节
	*/
	memset(a, 255, sizeof(a));
	for(int num: a)
	cout<<num<<" ";
	cout<<endl;
    //输出:-1 -1 -1 -1

	
	memset(a, -1, sizeof(a));
	for(int num: a)
	cout<<num<<" ";
	cout<<endl;
    //输出:-1 -1 -1 -1
	
	/*因为16843009的二进制码为:
	0000 0001 0000 0001 0000 0001 0000 0001
	也就是该数 4个字节都相同 */
	memset(a, 1, sizeof(a));
	for(int num: a)
	cout<<num<<" ";
	cout<<endl;
    //输出:16843009 16843009 16843009 16843009
	
	return 0;
}
	

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章