您的位置:首页 > 其它

memmove、memcpy、strcpy、memset的实现

2015-04-14 20:56 513 查看
memmove、memcpy、strcpy、memset

原型为:

void *memmove( void* dest, const void* src, size_t count );

char* strcpy(char* dest, const char* src);

void *memcpy(void *dest, const char* src, size_t count);

void* memset(void* dest, int value, size_t num)。

(1)strcpy提供了字符串的复制。

  即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。

(2)memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广

(3)复制的内容不同。

  strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。

(4)复制的方法不同。

  strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。

(5)用途不同。

  通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。

(6)memcpy只是memmove的一个子集,memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些。

[b]memcpy的实现:[/b]

//size_t指的是unsigned int
char* memcpy(void* dest,const void* src, size_t num)
{
char* p_dest = (char*)dest;
const char* p_src = (const char*)src;

assert((dest != NULL) && (src != NULL) && (dest != src));
while(num-- > 0)
*p_dest++ = *p_src++;
return dest;
}


strcpy的实现:

char* strcpy(char* dest, const char* src)
{
assert((dest!=NULL) && (src!=NULL) && (dest!=src));
char* address = dest;
while(*dest++ = *src++ )
NULL;
return address;
}


memmove的实现:

char* memmove(void* dest, const void* src,size_t num) {
assert((dest!=NULL) && (src!=NULL) && (dest!=src));
char* p_dest = (char*)dest;
const char* p_src = (const char*)src;

if(p_dest > p_src && p_dest < p_src + num) //内存有重叠,逆向拷贝
{
p_dest += num - 1;
p_src += num - 1;
while(num--)
*p_dest-- = *p_src--;
}
else
{ //p_dest<=p_src,此时无论是否重叠都可以使用正向拷贝
while(num--)
*p_dest++ = *p_src++;
}
return dest;
}


memset的实现:

char* memset(void* dest, int value, size_t num)
{
assert(dest != NULL);
unsigned char* p_dest = (unsigned char*)dest;
while(num-- > 0)
*p_dest++ = (unsigned char)value;
return dest;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: