memset 函数是内存赋值函数,用来给一块指定内存空间进行赋值的。
1、可以用它对一片内存空间逐字节进行初始化
2、其函数原型如下:
void* __cdecl memset(void* _Dst,int _Val,int _Size);
- _Dst:为数组名,也可以是指向某一内存空间的指针
- _v:为要填充的值
- _Size:为要填充的字节数
3、示例如下:
#include<iostream>
#include<string>
using namespace std;
template<typename T>
void PrintValue(T* arr,int len)
{
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
int arrInt[8];
char arrChar[8];
bool arrBool[8];
/*
对于整型的数组,只能初始化为0或-1
一个整型字符的大小为4个字节,所以要乘以sizeof(int)
*/
PrintValue(arrInt, 8);
memset(arrInt, 0, 8*sizeof(int));
PrintValue(arrInt, 8);
cout << "-----------------------\n";
/*
对于字符数组,填充的数字为所对应的ASCII表中的字符
*/
PrintValue(arrChar, 8);
memset(arrChar, 97, 8*sizeof(char));
PrintValue(arrChar, 8);
cout << "-----------------------\n";
/*
布尔数组,0为fasle,1为true
*/
PrintValue(arrBool, 8);
memset(arrBool, true, 8);
PrintValue(arrBool, 8);
cin.get();
}
结果如下:
【注意】:
- 由于memset函数是对内存空间进行逐字节的初始化,所以在给char之外的其它数组赋值时,只能将其初始化为0或-1
- 一定要注意,memset是按照字节对待初始化空间进行初始化的,也就是说,函数里面的第二个参数的那个初值(一般为0)是按照一个一个字节往第一个参数所指区域赋值的,所以,对于单字节数据类型(char)可以初始化为任意支持的值,都没有问题,但是对于非单字节数据类型只能初始化为0,而不能初始化成别的初值,因为对所有字节按任意顺序赋值0的结果都是0,而如果初始化为其他的值,就会一个字节一个字节的进行赋值,从而出现奇怪的结果。比如说,上面的例3之所以没有出错就是因为初始化为0,但是如果初始化为1,那么因为int一般是4个字节,那么相当于将一个int元素初始化成了0000 0001 0000 0001 0000 0001 0000 0001,这样对于一个int元素肯定不是1,而是一个很大的数
- memset中的第三个参数一定要使用sizeof操作符,因为每个系统下对类型长度的定义可能不一样
参考资料