下面主要对常用的几个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. webpack-react之webpack篇(http://www.jianshu.com/p/794d573d2c53)

    构建一个小项目——FlyBird,学习webpack和react.(本文成文于2017/2/25) 从webpack开始本篇从零开始,详细记录webpack的各个方面.文章中将会放入很多链接以便扩展, ...

  2. Bootstrap学习-排版

    1.标题 <h1>~<h6>,所有标题的行高都是1.1(也就是font-size的1.1倍). 2.副标题 <small>,行高都是1,灰色(#999) <h ...

  3. java利用url实现网页内容的抓取

    闲来无事,刚学会把git部署到远程服务器,没事做,所以简单做了一个抓取网页信息的小工具,里面的一些数值如果设成参数的话可能扩展性能会更好!希望这是一个好的开始把,也让我对字符串的读取掌握的更加熟练了, ...

  4. 解决WebStorm无法连接到Chrome

    问题: 点击 中的chrome时,出现了错误,如下: 解决办法: 找到 File>setting>Web Browser 修改为 C:\Program Files (x86)\Google ...

  5. Jmeter正则提取器常用的几种方式

    使用jmeter的同学都知道,jmeter提供了各种各样的提取器,如jsonpath.Beanshell.Xpath.正则等!!! 我们就针对正则提取器如何使用进行说明. 举例说明:假设取sessio ...

  6. C#(.Net)知识点记录

    一:批量插入"SqlBulkCopy"的应用 PS:"SqlBulkCopy"的官方释义:"Lets you efficiently bulk loa ...

  7. 解决ecshop进入后台服务器出现500的问题

    ecshop安装完成以后,前台页面打开正常,但是后台页面大家会出现500错误,看了很多的论坛和网站,删除过top.htm里面的JS代码的,.htaccess文件的修改的,都没有解决,后来找到原因, 原 ...

  8. SOA面向服务的架构理解

    Ø  单一应用架构 ·当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本. Ø  垂直应用架构 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几 ...

  9. 解决ubuntu更新中断后报错问题

    今天在更新ubuntu的时候,更新了一半被我强制关闭了,就报错了 当再使用sudo apt-get update命令时出现了dpkg was interrupted,you must manually ...

  10. python 发送附件至邮箱

    python 发送附件至邮箱 import smtplibfrom email.MIMEText import MIMETextfrom email.MIMEMultipart import MIME ...