memcpy 和memmove 都是把一个内存块拷贝到另一个内存块,其区别为:
memcpy 不考虑源内存块和 目标内存块 是否重叠的情况,即
source | |
dest | |
而memmove则考虑了这一情况,当遇到这种情况的时候,拷贝是从最高位开始,这样就保证source中还没拷贝的块不会因为dest的原因被修改。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
/**
*mymemcpy 把source 复制到dest, 返回dest的头指针, count 是指针长度
**/
void * mymemcpy(void * dest, const void * source, size_t count)
{
assert(dest != NULL || source != NULL);
void * ret = dest; //记录dest初始地址
while(count--)
{
*(char *)dest = *(char *)source;
//*dest = *source; void * 只知道所指内容的起始地址,不知道所指内容的大小(占几个字节),所以无法正确引用
dest = (char *)dest + 1;
source =(char *)source + 1;
}
return ret;
}
/**
* memcpy 没有考虑当source 和dest 有以下内存地址重叠的情况:
* source | |
* dest| |
* 即source向dest复制的时候,会改变source后面需要复制的内容。
* 解决办法,当这种情况出现时,可以考虑从最高位向最低位复制。
**/
void * mymemmove(void * dest, const void * source, size_t count)
{
assert(dest != NULL || source != NULL);
void * ret = dest;
if(dest < source || dest > (char *) source + count -1) //不会出现重叠情况
{
while(count--)
{
*(char *) dest = * (char *) source;
dest = (char *)dest + 1;
source = (char *)source + 1;
}
}
else
{
while(count--)
{
*((char *) dest + count) = *((char *) source + count );
}
}
return ret;
}
int main()
{
char a[] = "abcdefgh";
//mymemcpy(a+2, a, 4);
mymemmove(a+2, a, 4);
printf("%s\n",a);
return 0;
}
分享到:
相关推荐
今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同。 memcpy和memmove在MSDN的定义如下: 从两者的声明来看的确没有区别,我们来...
那么既然memcpy和memmove二者都是内存拷贝,那二者究竟有什么区别呢? 先说memcpy 你有没有好好的参加过一场C++笔试。让你写出memcpy的实现,这是多么常见的笔试题啊。现在,拿起你的演算纸和笔;是的,是笔和纸,...
常用函数的实现strcpy,memcpy,memmove,strcat,strcmp原型
。。。
不调用C库函数实现memmove-memcpy函数功能。
本篇文章是对memmove()与memcpy()的区别以及实现方法进行了详细的分析介绍,需要的朋友参考下
。。。
1、讲解内存移动函数memmove的原理,并对比与memcpy函数的区别;
1.11 memcpy和memmove函数的实现 1.12 strcat函数实现 1.13 使用库函数atoi,将char *→int 1.14 使用库函数itoa,将int→char * 1.15 不使用库函数,将int→char * 1.16 不使用库函数,将char *→int 1.17 求两个...
数组拷贝,不使用memcpy和memmove,有很多坑,避免内存溢出
memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...
memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...
memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...
memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...
memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...
* 常见的字符串函数实现: * strlen * strcpy strncpy * strcmp strncmp * strcat strncat * strstr * * 内存操作: * memset、memcmp、memcpy、memmove * * 字符串和数组转换: * atoi itoa *
strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchr,strnchr,strlen,strnlen,strspn,strpbrk,strtok,strsep,memset,bcopy,memcpy,memmove,memcmp,memscan,strstr,memchr.函数具体实现内容。对理解C语言和C编程有...