下面主要对常用的几个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. Java系统属性与Preferences API的简单介绍

    系统属性在和Preferences API都是键值对,前者只能当前应用程序中共享数据,而后者可以在用户的各个应用或用户之间共享数据. 系统属性 Java 的系统属性决定了 Java 程序实际运行的环境 ...

  2. 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 ...

  3. 咖啡师之路:第一日一杯Espresso

    代码敲累了.产品要发布了.熬夜啊加班啊. 精神完全不在状态. 咋办--- 咋办--- 咋办---! 来一杯Espresso浓缩咖啡.各位码农,码神们的必备良品! 咖啡每天要2-3杯,不管是速溶还是现磨 ...

  4. React组件开发(一)初识React

    *React不属于MVC.MVVM,只是单纯的V层. *React核心是组件(提高代码复用率.降低测试难度.代码复杂度). *自动dom操作,状态对应内容. *React核心js文件:react.js ...

  5. 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏

    3404: [Usaco2009 Open]Cow Digit Game又见数字游戏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 72  Solved ...

  6. 3097: Hash Killer I

    3097: Hash Killer I Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 425  Solved: 15 ...

  7. 2272: [Usaco2011 Feb]Cowlphabet 奶牛文字

    2272: [Usaco2011 Feb]Cowlphabet 奶牛文字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 138  Solved: 97 ...

  8. 简单的add函数的N种写法

    最近在学习es6,看到for-of这里,就想自己写着练习一下,于是就准备写一个小函数add来求和.函数很简单,如add(1,2,3)这样.于是我开始着手 一开始我是这么写的 function add( ...

  9. [译]Selenium Python文档:八、附录:FAQ常见问题

    另外一个FAQ:https://github.com/SeleniumHQ/selenium/wiki/Frequently-Asked-Questions 8.1.怎样使用ChromeDriver ...

  10. iOS打包后收不到推送信息

    今天遇到的一个特别神奇的问题: 应用在测试环境下打的包收不到推送了,打包之后都没有推送,但是我真机测试又是可以收到推送消息的.经过好久才找到原因,感觉很坑.这里记录一下问题: 1.由于我的推送第三方使 ...