void* __cdecl memset(void* _Dst, int _Val, size_t _Size);该函数经常用于内存清0,_Dst参数为目标内存区域的首地址(这个首地址的含义是赋值操作将从这个地址开始),_Val参数是为目标内存中每个字节所赋的值,也就是说,尽管是int类型的参数,实则上赋值的数据就在0~255。_Size参数则是需要进行赋值的字节数。总的来说,memset函数就是从指定的内存地址开始,为连续的_Size个字节逐个赋值。
例如一下代码:
#include < iostream >
using namespace std;
int main()
{
void * mem = new int [ 10 ];
memset(mem, 2 , sizeof ( int ) * 10 );
void * p = mem;
for ( int i = 0 ;i < 10 ;i ++ )
{
cout <<* ( int * )p << ' ' ;
p = ( int * )p + 1 ;
}
cout << endl;
}
输出结果为:
假如头脑不太清晰的时候,可能会迷惑为什么输出不是连续10个2,而是10个33686018?但是当把这个数转换成2进制看一下就清晰了。
33686018的二进制形式为:
很明显是对每个字节都赋予整数值2,因此最后作为int输出的时候就成为了一个很大的整数值。
如果调用的是 memset(mem,257,sizeof(int)*10) 那又会怎样? 正如之前所说,每个字节最大值也就是11111111,因此257将会溢出成2,由此输出结果将和之前的调用一样。
如果所指定的字节数越界怎么办?例如对于刚才的代码,如果调用memset(mem,2,sizeof(int)*100),那么就要看程序员的运气了,对于memset来说,其实没有越界不越界之分,数组的界是程序员逻辑一部分,memset不管,因此如果在超出的sizeof(int)*90的字节中,所有都没有被其他进程所占用,那么一切正常。但是如果有至少一个字节的内存区域属于其他进程,那么我这个程序将会出现运行时错误。