您的位置:首页 > 其它

memmove

2014-11-03 22:22 260 查看
/*
memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,
memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同
*/

#include <stdio.h>
#include <string.h>

void* memmove_c(void *dst, const void *src, size_t count);

struct
{
char name[15];
int age;

}person_src, person_dst;

int main(void)
{
char name[] = "luohan";
memmove_c(person_src.name, name, strlen(name)+1);
person_src.age = 24;
printf("person_src: name = %s, age = %d\n", person_src.name, person_src.age);

memmove_c(&person_dst, &person_src, sizeof(person_src));
printf("person_dst: name = %s, age = %d\n", person_dst.name, person_dst.age);

char str[] = "memmove can be very useful...use or not use";
memmove_c(str+20, str+15, 11);
puts(str);

memmove_c(str+10, str+15, 11);
puts(str);

return 0;
}

void* memmove_c(void *dst, const void *src, size_t count)
{
void *ret = dst;
// 低字节和高字节的区分
if (dst <= src || (char *)dst >= ((char *)src + count))
{
/*
* Non-Overlapping Buffers
* copy from lower addresses to higher addresses
*/
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else
{
/*
* Overlapping Buffers
* copy from higher addresses to lower addresses
*/
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C memmove