实现memcpy
需要考虑的问题:
1、参数检查
2、具体问题相关: 区域重叠
代码地址: https://github.com/huntinux/C/blob/master/memcpy.c
#include
#include /*
man memcpy:
SYNOPSIS
#include void *memcpy(void *dest, const void *src, size_t n);
DESCRIPTION
Thememcpy()functioncopiesn bytes from memory area src to memory area dest.
The memory areas must not overlap.Use memmove(3) if the memory areas do overlap.
*/// 标准的memcpy没有处理区域重叠,如果区域会重叠请使用memmovevoid *
memcpy(void *dest, const void *src, size_t n)
{
char *pdest;
const char *psrc;
int i ;
pdest = (char *)dest;
psrc = https://www.it610.com/article/(const char *)src;
assert(pdest!=NULL && psrc!=NULL);
// 处理区域重叠问题
if(pdest> psrc && pdest < psrc + n){
// 如果重叠了,则从后面开始复制
for(i=n-1;
i>=0;
i--){
pdest[i] = psrc[i];
}
}else{
while(n-->0){
*pdest++ = *psrc++;
}
} return dest;
}int
main()
{
char arr[] = "helloworld";
char *src, *dst;
// 有重叠的两个区域
src = https://www.it610.com/article/arr;
dst = arr + 4;
printf("%s\n", (char *)memcpy(dst, src, 6));
return 0;
}// 写函数的时候要注意
// 1. 参数处理
//参数是否正确(不能为NULL)(assert)
//不能修改的加上const
// 2. 具体问题的考虑
//此问题中,dest和src有重叠的时候该怎么办。所以要考虑到所有情况。
参考: http://bbs.csdn.net/topics/210050580
【实现memcpy】http://blog.csdn.net/gengshenghong/article/details/5634776
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树
- 人脸识别|【人脸识别系列】| 实现自动化妆
- 你觉得,写作需要情怀吗()
- paddle|动手从头实现LSTM