常见内存拷贝函数:memcpy()、memmove()、strcpy()的实现及区别
2017-05-05 16:20
656 查看
转载:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201322332592/
memcpy和memmove实现不同测试:
memcpy不考虑内存重合问题:
即src<dest&&dest<src+n,从前往后cpoy因为重合部分内容被修改,所以复制出来的内容不正确。
所以memcpy是正向copy n个字节的内容。
memmove考虑内存重合问题:
即src<dest&&dest<src+n,在这种情况下memmove会从后往前copy n个字节的内容。
测试代码及结果如下:
test_memcpy.cpp:
#include <stdio.h>
#include <string.h>
int main(int argc,char*argv[])
{
int i=0;
int a[10];
for(i=0;i<10;i++)
{
a[i]=i;
}
memcpy(&a[4],a,6*sizeof(int));
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
test_memmove.cpp:
#include <stdio.h>
#include <string.h>
int main(int argc,char*argv[])
{
int i=0;
int a[10];
for(i=0;i<10;i++)
{
a[i]=i;
}
//memcpy(&a[4],a,6*sizeof(int));
memmove(&a[4],a,6*sizeof(int));
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
测试结果:
2、我们已经搞清楚了memcpy和memmove实现的不同,下面给出两个函数的实现:
memcpy的实现:
void *memcpy(void *dest,void *src,unsigned int n)
{
if(dest==NULL||src==NULL)
return NULL;
void *ret=dest;
while(n>0) //不考虑内存重合问题,正向copy n个字节
{
*(char*)dest=*(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
n--;
}
}
memmove的实现:
void *memmove(void *dest,const void *src,unsigned int n)
{
if(dest==NULL||src==NULL)
return NULL;
char *pdest=(char*)dest;
char *psrc=(char*)src;
if(pdest<psrc||pdest>psrc+n) //内存没有重合或重合(dest<src&&dest+n>src)不影响正向copy
{
while(n--)
{
*pdest=*psrc;
pdest=pdest+1;
psrc=psrc+1;
}
}
else //dest>src&&dest<src+n的情况,两段内存空间有重合,从后往前copy。
{
pdest=pdest+n-1;
psrc=psrc+n-1;
while(n--)
{
*pdest=*psrc;
pdest=pdest-1;
psrc=psrc-1;
}
}
return dest;
}
strcpy拷贝字符串的实现:
strcpy和memcpy的不同是strcpy只能操作字符串,遇到'\0'就结束,并且不考虑溢出问题。
char *strcpy(char *dest,char *src)
{
if(dest==NULL||src==NULL)
return NULL;
char *ret=dest;
while((*src)!='\0')
{
*dest=*src;
dest++;
src++;
}
return dest;
}
memcpy和memmove实现不同测试:
memcpy不考虑内存重合问题:
即src<dest&&dest<src+n,从前往后cpoy因为重合部分内容被修改,所以复制出来的内容不正确。
所以memcpy是正向copy n个字节的内容。
memmove考虑内存重合问题:
即src<dest&&dest<src+n,在这种情况下memmove会从后往前copy n个字节的内容。
测试代码及结果如下:
test_memcpy.cpp:
#include <stdio.h>
#include <string.h>
int main(int argc,char*argv[])
{
int i=0;
int a[10];
for(i=0;i<10;i++)
{
a[i]=i;
}
memcpy(&a[4],a,6*sizeof(int));
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
test_memmove.cpp:
#include <stdio.h>
#include <string.h>
int main(int argc,char*argv[])
{
int i=0;
int a[10];
for(i=0;i<10;i++)
{
a[i]=i;
}
//memcpy(&a[4],a,6*sizeof(int));
memmove(&a[4],a,6*sizeof(int));
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
测试结果:
2、我们已经搞清楚了memcpy和memmove实现的不同,下面给出两个函数的实现:
memcpy的实现:
void *memcpy(void *dest,void *src,unsigned int n)
{
if(dest==NULL||src==NULL)
return NULL;
void *ret=dest;
while(n>0) //不考虑内存重合问题,正向copy n个字节
{
*(char*)dest=*(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
n--;
}
}
memmove的实现:
void *memmove(void *dest,const void *src,unsigned int n)
{
if(dest==NULL||src==NULL)
return NULL;
char *pdest=(char*)dest;
char *psrc=(char*)src;
if(pdest<psrc||pdest>psrc+n) //内存没有重合或重合(dest<src&&dest+n>src)不影响正向copy
{
while(n--)
{
*pdest=*psrc;
pdest=pdest+1;
psrc=psrc+1;
}
}
else //dest>src&&dest<src+n的情况,两段内存空间有重合,从后往前copy。
{
pdest=pdest+n-1;
psrc=psrc+n-1;
while(n--)
{
*pdest=*psrc;
pdest=pdest-1;
psrc=psrc-1;
}
}
return dest;
}
strcpy拷贝字符串的实现:
strcpy和memcpy的不同是strcpy只能操作字符串,遇到'\0'就结束,并且不考虑溢出问题。
char *strcpy(char *dest,char *src)
{
if(dest==NULL||src==NULL)
return NULL;
char *ret=dest;
while((*src)!='\0')
{
*dest=*src;
dest++;
src++;
}
return dest;
}
相关文章推荐
- 模拟实现字符串操作函数(strcpy,strstr,strcat,strcmp,strlen)与内存操作函数(memcpy,memmove)
- memset ,memcpy ,memmove,strcpy 的根本区别 与实现
- strcpy、memcpy、memmove的区别及实现
- strcpy、memcpy和memmove的区别和实现
- C语言中的字符串拷贝函数strcpy和内存拷贝函数memcpy的区别与实现
- memset、memcpy、memmove的常见用法和区别,以及memcpy与strcpy的区别
- strcpy、memcpy和memmove的区别和实现
- C语言中的字符串拷贝函数strcpy和内存拷贝函数memcpy的区别与实现
- memset ,memcpy ,memmove,strcpy 的根本区别 与实现
- C中字符串拷贝函数strcpy和内存拷贝函数memcpy的区别与实现
- strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove
- strcpy()、memcpy()、memmove()、memset()的实现
- C/C++:memmove、memcpy、strcpy三者的区别
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- 函数实现-memcpy-strcpy-memmove-memset
- 转:C/C++:memmove、memcpy、strcpy三者的区别
- strcpy()、memcpy()、memmove()、memset()的实现
- 转:C/C++:memmove、memcpy、strcpy三者的区别