memset&&sizeof

关于memset的用法,

常用于对于较大的结构体或数组进行清零操作//注意,是清零操作,如果进行统一赋值,要谨慎。

void *memset(    void *dest,    int c, size_t count );

函数将dest所指向的内存块全部以字节为单位,用c进行填充,函数第三个参数指定内存块的大小。

char a[20];
memset(a,0,sizeof(a));

 上述代码将a中的字符全部以0填充。

对于清零初始化,一般不用出现错误使用,但是在一些统一赋初值的运算中,就有可能会出现下述错误情况。

int a[5]; 
memset(a,1,sizeof(a));
//这里改成memset(a,1,5 *sizeof(int))也是不可以的   
for(int i = 0;i < 5;i++) 
cout<<a[i]<<" "; 

  a中所有元素的值将为16843009。

这是因为,memset是以字节为单位以指定值对内存填充,由于int型在一般机器上都占4为,因此每个整型被填充的值为0x01010101即为十进制的16843009

 

结论:使用memset对整型等进行赋值时要考虑清楚,注意memset的填充原理。

当然,memset在用于对char型以指定字符填充的运算中很难出现这些问题,因为char本来就只占一个字节。

 

关于sizeof

 

在memset函数第三个参数用来指定内存块的大小,就牵涉到sizeof的问题,

以下代码可供测试,并理解。

#include <iostream>

using namespace std;

struct Test
{
	int a;
	char b;
	int c[5];
	int d[20];
};


int main()
{
	Test *p=new Test;
	char *m=new char;
	char buf[20];
	int a[10];
	Test t;
	cout<<sizeof(p)<<endl;
  //4
	cout<<sizeof(m)<<endl;
//4
	cout<<sizeof(buf)<<endl;
//20
	cout<<sizeof(a)<<endl;
 
//40
	cout<<sizeof(t)<<endl;
//108
// 	char a[5];
// 		memset(a,'1',5);
// 		for(int i = 0;i < 5;i++) 
// 			cout<<a[i]<<" "; 
// 		system("pause");
// 	
// 		int a[5]; 
// 		memset(a,1,sizeof(a));
// 		//这里改成memset(a,1,5 *sizeof(int))也是不可以的   
// 		for(int i = 0;i < 5;i++) 
// 			cout<<a[i]<<" "; 
// 		system("pause"); 

	return 0;
}

  由此可见,在32位机器中,指针的大小都是4个字节,而数组或结构体定义的变量,则由实际所占位数决定

 

 

 

 

posted @ 2011-11-21 15:17  refazy  阅读(662)  评论(0编辑  收藏  举报