1.先看一下memcpy的声明

从str2所指向的内容的n个字节复制到str1所指向的内容中,注意这里是n个字节,后面实现该库函数时我会详细解释.size_t你们可以查一下它的定义,代表着无符号整型.

2.好,来看看我们如何实现它

void* my_memcpy(void* dest,const void* src, size_t num)
{void* ret = dest;assert(dest);assert(src);//有多少个字节执行多少次while (num--){//一个字节一个字节进行赋值*(char*)dest = *(char*)src;++(char*)dest;++(char*)src;}return ret;
}

这里你应该要产生一种疑问,为什么我们实现该库函数时,它的参数类型为什么要这样设置,难道就是简单地模仿?其实当你用这个库函数时,你会发现,它不仅可以实现数组之间的拷贝,字符串之间的拷贝,结构体数组的拷贝......你想想实现它要接受多少不同类型的地址(是整型的还是字符型的还是其它),所以我们在参数中用到了void *,因为它可接受任何类型的地址。好,这个问题解决了,又有一个问题来了,怎样去实现拷贝?

我们知道不同的数据类型,它所占的空间大小也不一样,所以(这里我直接说,后面会有具体实现的效果,好好去看一下那几个例子)我们一个字节一个字节地拷贝,化大为小,每块个小的一样,大的也就一样了.

3.例子1

void* my_memcpy(void* dest,const void* src, size_t num)
{void* ret = dest;assert(dest);assert(src);//有多少个字节执行多少次while (num--){//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用*(char*)dest = *(char*)src;++(char*)dest;++(char*)src;}return ret;
}
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[5] = { 0 };//将数组arr1的内容拷贝到arr2数组中,arr1数组大小为20个字节所以执行我们的函数20次my_memcpy(arr2, arr1, sizeof(arr1));//打印数组arr2for (int i = 0; i < 5; i++){printf("%d ", arr2[i]);}
}

3.1例子2

void* my_memcpy(void* dest,const void* src, size_t num)
{void* ret = dest;assert(dest);assert(src);//有多少个字节执行多少次while (num--){//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用*(char*)dest = *(char*)src;++(char*)dest;++(char*)src;}return ret;
}
int main()
{char arr1[] = "abcde";char arr2[10] = "hahahs";char* ret = (char*)my_memcpy(arr2, arr1, sizeof(arr1) - 1);//返回了字符串首地址这就是void* ret = dest的作用printf("%s\n", ret);
}

3.1例子3

#include <assert.h>
struct s
{int age;char name[20];
};
void* my_memcpy(void* dest,const void* src, size_t num)
{void* ret = dest;assert(dest);assert(src);//有多少个字节执行多少次while (num--){//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用*(char*)dest = *(char*)src;++(char*)dest;++(char*)src;}return ret;
}
int main()
{struct s arr3[] = { {20,"张三"},{30,"李四"} };struct s arr4[4] = { 0 };my_memcpy(arr4, arr3, sizeof(arr3));for (int i = 0; i < 2; i++){printf("%d %s\n", arr4[i].age, arr4[i].name);}
}

4总结

希望各位佬们提提建议,感谢阅读,点个赞吧.

库函数memcpy的实现相关推荐

  1. 使用memmove/memcpy库函数拷贝内存时容易产生的异常

    使用memmove/memcpy库函数拷贝内存时容易引发的异常 首先,我们来看一下C库函数memmove的原型,如下: void memmove( void dest, const void* src ...

  2. 模拟实现库函数(memcpy,memmove)

    模拟实现库函数memcpy,memmove 库函数memcpy和memmove功能都很强大也很重要,现在通过自我编码方式实现两个库函数的功能. 1.memcpy是C和C++使用的内存拷贝函数,函数原型 ...

  3. c语言内存拷贝 memcpy()函数

    需包含头文件:C 标准库 - <string.h> 文章目录 描述 声明 参数 返回值 实例1 实例2 实例3:覆盖原有部分数据 描述 C 库函数 void *memcpy(void *s ...

  4. C语言之memcpy()函数

    昨天被问了个很基础的C语言的问题. 写出u8 * memcpy(u8 * src, u8 * dst, size_t len)的定义. 比较紧张,以为要考虑很多东西:于是,将很多乱七八糟的情况考虑了下 ...

  5. 字符操作库函数以及内存操作库函数 C语言实现

    字符操作库函数 strlen strlen判断结束的标志为找到字符串中的'\0',也就是说如果字符串中间出现'\0'将会导致strlen停止 即strlen的返回值是'\0'前所出现的字符个数   然 ...

  6. memcpy函数与memmove函数

    1.1 memcpy函数是C语言内存拷贝函数,功能是从原内存地址的起始位置开始依次拷贝若干个字节到从目标地址的起始位置开始依次向后的若干个字节中. void* memcpy(void* dest,co ...

  7. CUDA Samples: Streams' usage

    以下CUDA sample是分别用C++和CUDA实现的流的使用code,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第十章,各个文件内容如 ...

  8. 《C和C++代码精粹》——2.5 普通指针

    本节书摘来自异步社区出版社<C和C++代码精粹>一书中的第2章,第2.5节,作者: [美]Chuck Allison,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  9. iOS之实现图片的压缩、解压缩、模糊、置灰、马赛克、黑白化、调色等处理

    压缩图片 func imageCompress(targetWidth:CGFloat) -> UIImage {let targetHeight = (targetWidth/width)*h ...

最新文章

  1. windows下git bash乱码问题
  2. 安装MYSQL出现checking for termcap functions library
  3. Microsoft Dynamics CRM server 2013   一般销售流程之 订单 简单介绍
  4. 网易云信实时音频框架背后:算法优化带来产品体验全面提升
  5. 再次学习javascript中的參数传递
  6. 43 FI配置-财务会计-固定资产-一般评估-定义折旧范围
  7. 软件开发人员薪资标准 人月_IT从业者培训前后薪资差距近3000块钱
  8. 关于静态成员变量的谈论
  9. Servlet工作原理解析2(以Tomcat为例)
  10. win10自带sftp服务器_用于Windows系统的免费SFTP服务器-Free SFTP Servers及各款软件功能对比...
  11. 信息系统项目管理师考试大纲(第2版)
  12. deepin photoshop_体验国产操作系统深度deepin一个月,谈谈使用感受!
  13. JavaScript操作canvas制作前端H5小游戏——Flappy Bird
  14. 字符串函数的模拟实现
  15. java8 collectors_java8的Collectors.reducing()
  16. ms office excel2013教程 - 从网站加载数据
  17. Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.0:repackage (repackage)
  18. 【北邮国院大三上】大三上高编/互联网协议/电信系统笔记
  19. Java异常的根类似_Java异常(Exception)类型及处理
  20. 独立按键控制继电器开关

热门文章

  1. Autojs+VSCode 的基本使用
  2. 2020,不知不觉,半年过了一半了!
  3. [Golang]力扣Leetcode - 374. 猜数字大小(二分查找)
  4. 2021数学建模美赛A题 题目解读
  5. fiddle 配置
  6. 校验和checksum算法
  7. 变形金刚ol服务器维护,变形金刚OL5月27日停机更新延迟开服公告
  8. 一句话木马@eval($_POST[“cmd“]);是什么意思(超详细)
  9. 代数方程与差分方程模型(二):原子弹爆炸的能量估计
  10. Remind-You Part2. setup.py打包代码, socket通讯