您的位置:首页 > 其它

memset,memcpy,strcpy

2011-12-15 13:04 337 查看
作用:对较大的结构体或数组进行清零操作的一种最快方式

1、memset是对字节进行操作,可以用memset可以对字符数组进行赋初值,但不能对非字符型数组赋初值

例如:



char ch[20];

memset(ch,0,sizeof(ch));//正确

memset(ch,0,20);//正确,因为字符只占一个字节



int num[20];

memset(num,0,sizeof(num));//正确

memset(num,0,20*sizeof(int));//正确

memset(num,1,sizeof(num));//错误,符能对非字符型数组进行赋值

2、清理结构体或结构体数组:



Some x;//结构体Some

memset(&x,0,sizeof(Some));



Some x[10];//结构体数组

memset(x,0,sizeof(Some)*10);

引用:

  memset可以方便的清空一个结构类型的变量或数组。

  如:

  struct sample_struct

  {

  char csName[16];

  int iSeq;

  int iType;

  };

  对于变量

  struct sample_strcut stTest;

  一般情况下,清空stTest的方法:

  stTest.csName[0]='\0';

  stTest.iSeq=0;

  stTest.iType=0;

  用memset就非常方便:

  memset(&stTest,0,sizeof(struct sample_struct));

  如果是数组:

  struct sample_struct TEST[10];

  则

  memset(TEST,0,sizeof(struct sample_struct)*10);

  另外:

  如果结构体中有数组的话还是需要对数组单独进行初始化处理的。

memset补充:

memset()的错误认识

♠作者:Tanky Woo ¦ Date: 11:07 上午 - 星期六 七月 24 2010
2 Comments

汗,以前一直以为可以

int a[10];
memset(a, 1, sizeof(a));
今天才发现,这是一个天大的错误,自己以前居然没有意识到~~~

事情追溯到今天下午做ACM题,想全部置1,结果发现输出的是怪数字。纳闷之下百度一查,石破天惊~~~

这里把原因说下:

先看了MSDN:

我不明白为何在给出的格式中有int出现,但是Remarks明确指出了:
Sets the first count characters of dest to the character c

其实这都不是重点,重点就是理解为何是这样:
memset是一个字节一个字节的设置.

把一个int的每个字节都设置为1,也就是0×01010101,十进制就是16843009

而在全部置0或者-1就没事。这是因为:

设置为0 就是0×00000000

设置-1就是FF,所以每个字节都置为-1就是0xFFFFFFFF,还是-1。

这也是为何可以置0和置1的原因。

如果想全部置1,只需用for即可。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

memcpy  用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。
例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
Strcpy   就只能拷贝字符串了,它遇到'\0'就结束拷贝。
例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
str也可以用用个参数的strncpy(a,b,n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息