模拟实现库函数(memcpy,memmove)
模拟实现库函数memcpy,memmove
库函数memcpy和memmove功能都很强大也很重要,现在通过自我编码方式实现两个库函数的功能。
1.memcpy是C和C++使用的内存拷贝函数,函数原型为
void *memcpy(void *destin, void *source, unsigned n);
函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
2.memmove用于拷贝字节,函数原型为:
void memmove( void dest, const void* src, size_t count );
如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。
3.作用与其区别:
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。
代码实现两个函数:
1.memcpy
void* my_memcpy(void* b, const void* a, int num)
{assert(b);assert(a);char* p = (char*)b;char* q = (const char*)a;while (num) {*p++ = *q++;num--;}return b;
}int main()
{int a[] = { 1,2,3,4,5,6 };int b[10] = { 0 };my_memcpy(b, a, sizeof(a));for (int i = 0; i < 10; i++) {printf("%d ", b[i]);}return 0;
}
2.memmove
#include<stdio.h>
#include<assert.h>
#include<string.h>void* my_memmove(void* b, void* a, int num)
{assert(b);assert(a);char* p = (char*)b;char* q = (char*)a;if (q < p && p < q + num) {q = q + num - 1;p = p + num - 1;while (num) {*p-- = *q--;num--;}}elsewhile (num) {*p++ = *q++;num--;}return b;
}int main()
{/*int a[] = { 1,2,3,4,5,6 };int b[10] = { 0 };*/char str[10] = "abcde123";my_memmove(str + 1, str, strlen(str) + 1);/*for (int i = 0; i < 10; i++) {printf("%d ", b[i]);}*/printf("%s", str);return 0;
}
模拟实现库函数(memcpy,memmove)相关推荐
- 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove
模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove ================================ 1 strstr 字符 ...
- C语言程序设计 | 模拟实现内存操作函数:strncpy, strncat, strncmp, memcpy, memmove
模拟实现字符串和内存操作函数(二)目录: strncpy strncat strncmp strcmp memcpy memmove strncpy char* strncpy(char* dst, ...
- 《strcmp,strcpy,memcpy,memmove等函数模拟实现》
模拟实现常见字符串函数比如:strcmp,strcpy,memcpy,memmove等函数 1.模拟实现memcpy函数 2.模拟实现memmove函数 3.模拟实现strstr函数 4.模拟实现st ...
- C语言模拟实现库函数 atoi
库函数atoi介绍 : 作用:将字符串中的数字转换成整形数字 参数:字符串指针 返回类型:int整形 模拟实现代码如下: #define _CRT_SECURE_NO_WARNINGS 1// 模拟实 ...
- 【C语言】模拟实现库函数 strcpy(复制字符串内容) 与 strlen(求字符串长度)
前言:对于库函数的使用,我们不仅要会使用方法,更要知晓使用原理,而知晓使用原理最好的方法就是模拟相应库函数的使用. 今天我们就来模拟 strcpy(复制字符串内容) 与 strlen(求字符串长度)这 ...
- 实用调试技巧 Debug Release F10 F11 初始化 越界访问 堆栈 模拟实现库函数
目录 一.什么是bug 二.调试是什么?有多重要? 1.调试 2.调试的基本步骤 三.Debug和Release 四.windows环境调试介绍 1.调试环境的准备 2.学会快捷键 Ctrl+U 改大 ...
- strcpy实现 模拟实现库函数strcpy
strcpy实现 模拟实现库函数strcpy #include<stdio.h> #include<assert.h>char* my_strcpy(char* dest, c ...
- c语言atof函数源码,【c语言】模拟实现库函数的atof函数
// 模拟实现库函数的atof函数 #include #include #include #include double my_atof(char const *p) { double ret = 0 ...
- 函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串
char *strncpy(char *dest, const char *src, size_t n) *strncpy(char *dest, const char *src, size_t n) ...
最新文章
- 动态视频目标检测和跟踪技术(入门)
- 【Go语言】【4】GO语言类型和为类型增加方法
- 计算机组装学位,《计算机组装与维护》虚拟实验界面设计与制作学位论文 .doc...
- css画个框,用CSS绘制带有边框的尖端
- thinkphp3 页面跳转外部链接_一文看懂小程序跳转的规则和注意事项
- mysql 异常笔记
- ubuntu19.04支持android,Ubuntu 19.04 最终发布日期和计划功能公布
- sql server 标准版升级专业版或者开发版没有sql server profiler
- 特征选择算法之ReliefF算法python实现
- 抱歉,Xposed真的可以为所欲为——1.基础知识储备
- Android平台语言支持状态(MTK6589)
- 调用百度语音合成API,Qt实现语音合成,Qt语音合成
- 地理信息系统(Geographic Information System或 Geo-Information system,GIS)
- 共享充电宝的终局:金钱游戏
- 对物联网的感悟_物联网心得体会总结
- linux如何添加旅游,旅游散记
- 5g基站服务器需要芯片吗,依靠芯片就能实现5G吗?没有基站和基带会很尴尬!...
- Android OTA在线升级一(架构分析)
- 到客户现场进行项目开发流程
- python语言的实验心得体会范文_实验心得体会范文