memory库函数的实现
下面主要对常用的几个memory库函数的实现(memcpy、memmove、memset、memcmp):
memcpy函数与memmove函数:
相同点:
两者实现的功能均为从src拷贝count个字符到dest。
不同点:
1、memcpy函数不考虑内存是否有覆盖的问题,也就是说他只负责完成拷贝工作,至于拷贝后的值正确与否,它是不理会的。
2、memmove函数考虑了内存覆盖的问题:1)当无覆盖情况时,功能及拷贝结果与memcpy函数相同;
2)当有内存覆盖时,能够确保拷贝后的值得正确性。
3、内存无覆盖及有覆盖的情况如下:


代码实现如下
//memcpy:内存拷贝函数,从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
char* my_memcpy(char* dst,const char* src,size_t count)
{
assert(dst != NULL);
assert(src != NULL);
assert(count <= strlen(src)+1);
char* pDst = dst;
const char* pSrc = src;
while (count--)
{
*pDst = *pSrc;
pDst++;
pSrc++;
}
return dst;
}
--------------------------------------------------------------------------------------------------------------------------------------------
/* memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前
将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。*/
char* my_memmove(char* dst,const char* src,size_t count)
{
assert(dst != NULL);
assert(src != NULL);
assert(count <= strlen(src) + 1);
char* pDst = dst;
const char* pSrc = src;
if (pDst > pSrc + count || pDst < pSrc)//不包含内存覆盖
{
//正向拷贝
while (count--)
{
*pDst = *pSrc;
pDst++;
pSrc++;
}
}
else//存在内存覆盖问题
{
//反向拷贝(从尾到头)
pDst += count;
pSrc += count;
while (count--)
{
*pDst = *pSrc;
pDst--;
pSrc--;
}
}
return dst;
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
memset函数:将str所指内存区域的前count个字节设置成字符c。(注:该函数是对字节进行设置)
//memset内存设置函数:将str所指内存区域的前count个字节设置成字符c。
代码实现如下:
void* my_memset(void* str, int c, int count)
{
assert(str != NULL);
char* pStr = (char*)str;
while (count--)
{
*pStr = c;
pStr++;
}
return str;
}
1、情况一:对字符数组进行设置
int main()
{
char a[10];
memset(a , 0 , 10 );
}
数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。
2、情况二:对整形数组进行设置
int main()
{
int b[10];
memset(b , 0 , 10 );
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//memcmp是比较内存区域str1和str2的前count个字节。该函数是按字节比较的。
int my_memcmp(const void *str1, const void *str2, size_t count)
{
if (str1 == NULL && str2 == NULL)
{
return 0;
}
const char* pStr1 = (const char*)str1;
const char* pStr2 = (const char*)str2;
int res = 0;
for (pStr1, pStr2; count > 0; ++pStr1, ++pStr2, --count)
{
res = *pStr1 - *pStr2;
if (res != 0)
break; }
return res;
}
memory库函数的实现的更多相关文章
- 《C与指针》第九章练习
本章问题 1.C语言缺少显示的字符串数据类型,这是一个优点还是一个缺点? answer: (这个问题存在争论(尽管我有一个结论))目前这个方法的优点是字符数组的效率和访问的灵活性,它的缺点是有可能引起 ...
- 【NX二次开发】NX内部函数,libugui.dll文件中的内部函数
本文分为两部分:"带参数的函数"和 "带修饰的函数". 浏览这篇博客前请先阅读: [NX二次开发]NX内部函数,查找内部函数的方法 带参数的函数: bool A ...
- STM32库函数编程、Keli/MDK、stm32f103zet6
catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...
- C语言标准库函数(网络上copy的)
C语言标准库函数 标准io函数Standard C I/Oclearerr() clears errorsfclose() close a filefeof() true if at the end- ...
- Best Practices for Performance_1、2 memory、Tips 性能和小的优化点、 onTrimMemory
http://developer.android.com/training/articles/memory.htmlhttp://developer.android.com/tools/debuggi ...
- STM32F4读写内部FLASH【使用库函数】
STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多.平时写的代码,烧写完之后还有大量的剩余.有效利用这剩余的FLASH能存储不少数据.因此研究了一下S ...
- STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)
数据传输时要从支持那些相关的标准?传输的速度?什么时候开始?什么时候结束?传输的内容?怎样防止通信出错?数据量大的时候怎么弄?硬件怎么连接出发,当然对于stm32还要熟悉库函数的功能 具起来rs232 ...
- 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files
原文作者:Gustavo Duarte 原文地址:http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait ...
- C51库函数积累
C51库函数积累: (1)_chkfloat_: 函数定义:unsigned char _chkfloat_ ( float val); /* number to check */ 函数功能:_chk ...
随机推荐
- Java设计模式之《享元模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...
- Ionic2 开发笔记(1)ionic2 +angular2搭建
1.去node.js官网下载对应版本https://nodejs.org/en/(不会请看OnsenUi搭载,里面有详细过程) 2.然后通过npm下载Ionic和cordova $ npm insta ...
- 关于在链路聚合下做smart,monitor link的转发测试
关于在链路聚合下做smart,monitor link的转发测试 这次又要开始瞎折腾了.没事找事了.毕竟我还是很无聊的: 这个实验主要要涉及到以下几个方面: 1.gvrp的应用: 2.Smart Li ...
- java中的对象
对象 --计算机语言中的对象 通常,我们可以从一般事物的三个方面,去认识事物: 一.是什么? 二.为什么? 三.怎么样? 接下来,我们也利用这三个方面的思维,去 ...
- Python中类的方法属性与方法属性的动态绑定
最近在学习python,纯粹是自己的兴趣爱好,然而并没有系统地看python编程书籍,觉得上面描述过于繁琐,在网站找了一些学习的网站,发现廖雪峰老师的网站上面的学习资源很不错,而且言简意赅,提取了一些 ...
- Dark的项链(树链剖分)
P2272 - Dark的锁链 Description 无向图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边.Dark有N – 1条主要边,并且Dark的任意两个节点之间都存在一条只由 ...
- 会话管理(Cookie/Session技术)
什么是会话:用户打开浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称为一个会话: 会话过程需要解决的问题:每个用户在使用浏览器与服务器进行会话的过程中,都可能会产生一些 ...
- SEQ序号与ACK序号理解总结
备查 SEQ序号与ACK序号理解总结
- unity3d屏蔽Windows10输入法
在win10上,如果安装了某些输入法(比如QQ输入法),会造成unity的键盘事件被输入法捕获而不能触发的情况.只有将输入法切换到英文状态下才能响应键盘事件. 解决办法有, 1:用户主动切换输入法,甚 ...
- 腾讯云数据库团队:PostgreSQL TOAST技术理解
作者介绍:胡彬 腾讯云高级工程师 TOAST是"The Oversized-Attribute Storage Technique"的缩写,主要用于存储一个大字段的值.要理解TOA ...