字符串拷贝函数
char * strcpy(char *dst,const char *src)
{
if((dst==NULL)||(src==NULL))
return NULL;
char *ret = dst; //[1]
while ((*dst++=*src++)!='\0'); //[2]
return ret;//[3]
}
(1)const 修饰:源字符串参数用const修饰,防止修改源字符串;
(2)空指针检查:源指针和目的指针都有可能会出现空指针的情况,所以应该对其进行检查;
(3)为什么要设置ret 指针以及返回ret指针的位置[3],由于目的指针dst已经在进行移动了,所以用辅助指针ret表明首指针;
(4)以上所示[2]处,为简单的字符串的复制过程,正好表明strcpy函数遇到'\0'将会停止;
内存拷贝函数
void *memcpy( void *dest, const void *src, size_t count );
void *memmove( void* dest, const void* src, size_t count )
void* memcpy(void* dst, const void* src, size_t n)//(不考虑内存重叠版本)
{
if (!dst || !src || n < 0)
{
return NULL;
}
void* temp = dst;
while (n--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return temp;
}
void *memcpy(void *dest, const void *src, size_t count)//(考虑内存重叠版本)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count)) {// 若dst和src区域没有重叠,则从起始处开始逐一拷贝
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else { // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
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);
}
void * memmove(void* dst, const void* src, size_t count)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count)) {
// 若dst和src区域没有重叠,则从起始处开始逐一拷贝
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else {
// 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
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);
}
1.memcpy和memmove相同点
都是用于从src拷贝count个字节到dest。
2.memcpy和memmove区别
如果目标区域和源区域有重叠的话:
memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖。
memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改,当目标区域与源区域没有重叠则和memcpy函数功能相同。
但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。
memmove的处理措施:
(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝
从代码可以看出来考虑内存重叠的memcpy版本其实就是memmove函数原型