下面主要对常用的几个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 );
    }
    数组b是整型的,而使用 memset是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。而非想要的1。
 
  3、  如果用memset(a,1,20),就是对a指向的内存的20个字节进行赋值,每个都用数1去填充,转为二进制后,1就是00000001,占一个字节。
 
    一个int类型占4字节,合一起是0000 0001,0000 0001,0000 0001,0000 0001,转化成十六进制就是0x01010101,就等于16843009,
    
    就完成了对一个int元素的赋值了。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//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库函数的实现的更多相关文章

  1. 《C与指针》第九章练习

    本章问题 1.C语言缺少显示的字符串数据类型,这是一个优点还是一个缺点? answer: (这个问题存在争论(尽管我有一个结论))目前这个方法的优点是字符数组的效率和访问的灵活性,它的缺点是有可能引起 ...

  2. 【NX二次开发】NX内部函数,libugui.dll文件中的内部函数

    本文分为两部分:"带参数的函数"和 "带修饰的函数". 浏览这篇博客前请先阅读: [NX二次开发]NX内部函数,查找内部函数的方法 带参数的函数: bool A ...

  3. STM32库函数编程、Keli/MDK、stm32f103zet6

    catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...

  4. C语言标准库函数(网络上copy的)

    C语言标准库函数 标准io函数Standard C I/Oclearerr() clears errorsfclose() close a filefeof() true if at the end- ...

  5. Best Practices for Performance_1、2 memory、Tips 性能和小的优化点、 onTrimMemory

    http://developer.android.com/training/articles/memory.htmlhttp://developer.android.com/tools/debuggi ...

  6. STM32F4读写内部FLASH【使用库函数】

    STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多.平时写的代码,烧写完之后还有大量的剩余.有效利用这剩余的FLASH能存储不少数据.因此研究了一下S ...

  7. STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)

    数据传输时要从支持那些相关的标准?传输的速度?什么时候开始?什么时候结束?传输的内容?怎样防止通信出错?数据量大的时候怎么弄?硬件怎么连接出发,当然对于stm32还要熟悉库函数的功能 具起来rs232 ...

  8. 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files

    原文作者:Gustavo Duarte 原文地址:http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait ...

  9. C51库函数积累

    C51库函数积累: (1)_chkfloat_: 函数定义:unsigned char _chkfloat_ ( float val); /* number to check */ 函数功能:_chk ...

随机推荐

  1. Robot Framework 使用笔记

    条件表达式: Run Keyword If 表达式 执行动作   ... ELSE IF 表达式 执行动作 ... ELSE 执行动作   基础格式见上表,下面是我遇到的坑: 表达式:判断字符串变量是 ...

  2. 本地存储和cookies之间的区别

  3. eclipse和myeclipse设置默认编码格式为UTF-8

    1:jsp页面设置默认为utf-8 以eclipse为例 2:java界面设置: Window->Preferences->General->Workspace 面板Text fil ...

  4. Docker 使用指南 (四)—— 数据卷的使用

    一.数据卷的使用 有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker中提供了数据卷可以供你方便的操作数据.数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用 ...

  5. C++基础——C面向过程与C++面向对象编程01_圆面积求解

    #include "iostream";//包含C++的头文件using namespace std;//使用命名空间std标准的命名空间(在这个命名空间中定义了很多标准定义)vo ...

  6. HTML5 移动页面自适应手机屏幕四类方法

    1.使用meta标签:viewport H5移动端页面自适应普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的,但是各设备对该标签的解释方式及支持程度不同造成了不能兼容所有浏览器或系统. ...

  7. Win10下 VS2017 安装失败 未能安装包“Microsoft.VisualStudio.AspNet45.Feature,version=15.0.26208.0”

    事情的起因是这样的,前段时间,VS2017发布当天,想在自己的Win10上安装VS2017,然而,由于自己的系统很久没有更新(PS:自己关闭了Windows更新). 安装提示:未能安装包“Micros ...

  8. 彻底取消Myeclipse对js文件的校验

    这个是我在网上看到的,自己也做一下笔记. 一般情况下,关掉校验:Window -->Preferences -->MyEclipse -->单击Validation,这样不一定有效. ...

  9. 老李分享:Uber究竟是用什么开发语言?

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  10. AndroidStudio升级后出现Refresh gradle project和connection timed out的原因和解决方法

    笔者发现现在升级AndroidStudio不需要FQ了,于是在看到了升级提醒后手贱点击了升级.可悲剧的一幕发生了, 正在写的一个项目从上到下密密麻麻的错误,看了一下提示要求升级Gradle 那就升级吧 ...