不要使用库函数,写出void *memcpy(void *dst, const void *src, size_t count),其中dst是目标地址,src是源地址。
来源:互联网 发布:淘宝网买桌椅套子 编辑:程序博客网 时间:2024/06/05 02:55
拷贝的时候要注意源内存地址和目的地址之间的关系,就是源内存地址和目标地址是否交叉。
1,如果没有交叉的情况,那直接循环拷贝就可以了。
2,如果有交叉的情况,交叉的情况也分为两种
第一种如图所示:
这种情况是:src>=dst&&src<=dst+count-1
第二种如图所示:
这种情况就是:dst>src&&dst<src+count-1.
下面以数组:int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};为例,进行:memcpy(a, a+4, sizeof(int)*6);
第一种情况如图所示:
第二种情况如图所示:
由图中的结果可以看出,第一种交叉情况和没有交叉的情况一样,直接循环拷贝就可以。但是如果有交叉的情况就要从源地址的最后一个字节从前到后进行拷贝。
下面给出程序,只是参考
#include<stdio.h>void *memcpy(void *dst,const void *src,size_t count){char *p_dst=(char*)(dst);char *p_src=(char*)(src);unsigned int i;if(dst>src&&(char*)dst<=((char*)src+count-1))//如果p_dst=p_src那直接拷贝就可以了, { //如果p_dst=p_src+count-1,说明还有一个重叠, while(count){*(p_dst+count-1)=*(p_src+count-1);count--;}}else{for(i=0;i<count;i++)*(p_dst+i)=*(p_src+i);}return dst;}void main(){int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};memcpy(arr+4,arr,sizeof(int)*6);for(int i=0;i<10;i++)printf("%d\t",arr[i]);printf("\n");}
以上例子为测试第二种情况的事例。如果不正确之处,希望给予点评。
- 不要使用库函数,写出void *memcpy(void *dst, const void *src, size_t count),其中dst是目标地址,src是源地址。
- void* memcpy(void* dst, const void* src, int size)
- 实现内存复制函数void * memcpy(void *dst,void *src,int count).
- void* mymemcpy( void* dest, const void* src, size_t count )
- void *memcpy(void *dst,void const *src,size_t len):从src的起始位置复制len个字节到dst的内存起始位置。可以用这种方法复制任何类型的值。
- memcpy函数的使用总结void *memcpy(void *dest, const void *src, size_t n);
- 用C语言实现一个公用库函数void * memmove(void *dest,const void *src,size_t n)
- extern void * memcpy(void *dest,void *src,unsigned int count)
- void LUT(InputArray src, InputArray lut, OutputArray dst)
- void OnRenderImage(RenderTexture src, RenderTexture dst) 的坑
- [百度试题]用C语言实现函数void * memmove(void *dest,const void *src,size_t n)。memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上
- 用C语言实现函数void * memmove(void *dest, const void *src, size_t n)。
- 用C语言实现函数void * memmove(void *dest, const void *src, size_t n)
- 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
- 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
- 用C语言实现函数void * memmove(void *dest, const void *src, size_t n)
- 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
- void *memmove(void *dest, const void *src, size_t n) 的实现
- 我的WCF之旅(1):创建一个简单的WCF程序
- 禁用ViewState
- 程序员从初级到中级10个秘诀
- 学会用core dump调试程序错误(转)
- JS弹窗
- 不要使用库函数,写出void *memcpy(void *dst, const void *src, size_t count),其中dst是目标地址,src是源地址。
- java生成doc文件代码
- http协议的几个概念
- IE6 checkbox的defaultChecked
- 第十届Flash开发者大会火热报名
- 得到android程序和手机终端信息
- WEB开发的一些基本原则
- 优化JVM参数提升Eclipse运行速度
- linux 配置及安装jdk,tomcat 详细步骤。