Posted on 2010-08-14 18:23
幻海藍(lán)夢 閱讀(514)
評論(0) 編輯 收藏 所屬分類:
C++
原文:http://www.cnblogs.com/sophia0405/archive/2008/10/23/1293189.html
memset,memcpy,strcpy 的區(qū)別
一.函數(shù)原型
strcpy
extern char *strcpy(char *dest,char *src);
#include <string.h>
功能:把src所指由NULL結(jié)束的字符串復(fù)制到dest所指的數(shù)組中
說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回指向dest的指針
memcpy
extern void *memcpy(void *dest,void *src,unsigned int count);
#include <string.h>
功能:由src所指內(nèi)存區(qū)域復(fù)制count個(gè)字符串到dest所指內(nèi)存區(qū)域.
說明:src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向dest的指針.
memset
extern void *memset(void *buffer,int c,int count);
#include <string.h>
功能:把buffer所指內(nèi)存區(qū)域的前count個(gè)字節(jié)設(shè)置成字符c
說明:返回指向buffer的指針.
二.區(qū)別
memset 用來對一段內(nèi)存空間全部設(shè)置為某個(gè)字符,一般用于在對定義的字符串初始化為' '或者'"0';
例: char a[100];
memset(a,'"0',sizeof(a));
memcpy 是用來做內(nèi)存拷貝,可以用來拷貝任何數(shù)據(jù)類型的對象,可以指定拷貝的數(shù)據(jù)長度;
例:
char a[100],b[50];
memcpy(b,a,sizeof(b)); //注意:如果使用sizeof(a),會(huì)造成內(nèi)存溢出
mem是一段內(nèi)存,他的長度,必須自己記住.memcpy是見著什么拷貝什么。
strcpy 就只能拷貝字符串,它遇到'"0'就結(jié)束拷貝;
例:char a[100],b[50];
strcpy(a,b);
如用strcpy(b,a)要注意a中的字符串長度(第一個(gè)'"0'之前) 是否超過50,如果超過,則會(huì)造成b的
內(nèi)存溢出.它是不會(huì)拷貝'"0'的,所以一般還有加一個(gè)語句:
*a='"0';
三.使用技巧
memset 可以方便的清空一個(gè)數(shù)據(jù)結(jié)構(gòu)的變量或數(shù)組.
如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
對于變量
struct sample_struct stTest;
一般情況下,初始化stTest的方法:
stTest.csName[0]='"0';
stTest.iSeq=0;
stTest.iType=0;
而用memset:
memset(&stTest,0,sizeof(struct sample_struct));
如果是數(shù)組:
struct sample_struct TEST[100];
memset(TEST,0,sizeof(struct sample_struct)*100);
strcpy是拷貝字符串,以"0為標(biāo)志結(jié)束(即一旦遇到數(shù)據(jù)值為0的內(nèi)存地址拷貝過程即停止)
strcpy的原型為
char *strcpy(char *dest, const char *src)
而memcpy是給定來源和目標(biāo)后,拷貝指定大小n的內(nèi)存數(shù)據(jù),而不管拷貝的內(nèi)容是什么(不僅限于字符)
memcpy的原型為
void *memcpy(void *dest, const void *src, size_t n);