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