memset函数(新手入门)

  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的字节中,所有都没有被其他进程所占用,那么一切正常。但是如果有至少一个字节的内存区域属于其他进程,那么我这个程序将会出现运行时错误。

posted @ 2010-08-14 13:43  DOF_KL  阅读(2250)  评论(0编辑  收藏  举报