**一、**memcpy和memmove memcpy和memmove是C语言库中的函数,它们的作用都是拷贝字符串,区别是memmove中src和和dest内存所指的内存区域可以重叠,memcpy中将src和dest所指的内存区域不可以重叠,且在复制之前要确保dest中有着足够的空间来容纳src的字符串。但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,同时也增加了开销。 memmove的处理措施: (1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝 (2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝 (3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝
- memmove的代码:
void * memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
?
if (dst <= src || (char *)dst >= ((char *)src + count)) {
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else {
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
?
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
?
return(ret);
}
memmove 函数:将src里的count个字节拷贝到dest中,可以重复拷贝。
2.memcpy的代码块:
void * memcpy ( void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst);
assert(src);
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
memcpy函数:将src里的count个字节拷贝到dst中。 二、实际运用: 1、memcpy的原型:
void * memcpy ( void * destination, const void * source, size_t num );
2、mmmove的原型:
void * memmove ( void * dest, const void * src, size_t num );
常见的mem系列 1、memset
void * memset ( void * ptr, int value, size_t num );
功能:将ptr所指的内存区域的前num个字节替换成字符num。 2、memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
功能:比较两个字符串大小,若s1>s2返回值<0,相等时等于0,大于时返回值大于0; 3、memchr
void * memchr ( const void *buf, int ch, size_t count);
功能:从buf所指的区域前count个字节查找字符ch;在第一此查找成功之后就停止查找。
|