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系统属性与Preferences API的简单介绍
系统属性在和Preferences API都是键值对,前者只能当前应用程序中共享数据,而后者可以在用户的各个应用或用户之间共享数据. 系统属性 Java 的系统属性决定了 Java 程序实际运行的环境 ...
- 11g R2 RAC启动关闭步骤
1.关闭监听 /u01/app/11.2.0/grid/bin/srvctl stop listener -n redhat-rac01 /u01/app/11.2.0/grid/bin/srvctl ...
- 咖啡师之路:第一日一杯Espresso
代码敲累了.产品要发布了.熬夜啊加班啊. 精神完全不在状态. 咋办--- 咋办--- 咋办---! 来一杯Espresso浓缩咖啡.各位码农,码神们的必备良品! 咖啡每天要2-3杯,不管是速溶还是现磨 ...
- React组件开发(一)初识React
*React不属于MVC.MVVM,只是单纯的V层. *React核心是组件(提高代码复用率.降低测试难度.代码复杂度). *自动dom操作,状态对应内容. *React核心js文件:react.js ...
- 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏
3404: [Usaco2009 Open]Cow Digit Game又见数字游戏 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 72 Solved ...
- 3097: Hash Killer I
3097: Hash Killer I Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 425 Solved: 15 ...
- 2272: [Usaco2011 Feb]Cowlphabet 奶牛文字
2272: [Usaco2011 Feb]Cowlphabet 奶牛文字 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 138 Solved: 97 ...
- 简单的add函数的N种写法
最近在学习es6,看到for-of这里,就想自己写着练习一下,于是就准备写一个小函数add来求和.函数很简单,如add(1,2,3)这样.于是我开始着手 一开始我是这么写的 function add( ...
- [译]Selenium Python文档:八、附录:FAQ常见问题
另外一个FAQ:https://github.com/SeleniumHQ/selenium/wiki/Frequently-Asked-Questions 8.1.怎样使用ChromeDriver ...
- iOS打包后收不到推送信息
今天遇到的一个特别神奇的问题: 应用在测试环境下打的包收不到推送了,打包之后都没有推送,但是我真机测试又是可以收到推送消息的.经过好久才找到原因,感觉很坑.这里记录一下问题: 1.由于我的推送第三方使 ...