C语言中一些内存函数相关知识总结

分享3个关于处理内存块的函数

头文件均是<string.h>

1.memcpy函数

     顾名思义为内存拷贝函数

(1)函数原型:void * memcpy ( void * destination , const void * source , size_t num );

  其中void * source是源头空间的地址,void * destination是目标空间的地址,size_t num是拷贝的字节数,函数的返回值是目标空间的起始地址。

(2)一些特点:memcpy函数是从source指向的位置开始向后复制num个字节的数据到destination中,这个函数在遇到'\0'的时候并不会停下来,如果destination和source有任何的重叠会导致复制的结果都是未定义的(当然有重叠的时候可以临时拷贝一份)。

(3 )代码模拟实现一下这个函数:

这里截取函数的主体部分来解析一下,具体的完整代码参考以下链接:

代码模拟实现memcpy函数 · zyzyzy_mhmhmh/c语言学习 - Gitee.com

这个代码里面需要注意的点很多:

<1>首先是注释部分关于为什么要用强制类型转换的原型;

<2>然后是为什么要强制转化为char * 类型,这样做保证了精度更小,实现了多种情况的覆盖,例如如果传入17个字节,强制类型转化为int类型必然是不合适的;

<3>为什么不用(char*)dest++这样的语句呢,是因为强制类型转换是临时的行为,在下一次循环就会消失,所以像图中所示即可:

2.memmove函数

    顾名思义为内存移动函数

(1) 函数原型:void * memmove ( void * destination , const void * source , size_t num );

这些参数的具体意义和上面memcpy是一模一样的

(2)一些特点:这个函数的功能和memcpy函数是差不多的,都是有不一样的地方,比如有重叠部分时候它也可以拷贝。

这样类似的代码在上一个函数中明显是行不通的,而这个函数是可以实现的。

这个函数就是用来处理涉及到重叠内存的拷贝的,并且重叠不重叠都可以搞定,可以理解成memmove函数可以完全替代memcpy函数。

(3)函数的模拟代码主体部分如下:

思考过程很巧妙值得学习。

具体代码可以参考:模拟实现mommove函数 · zyzyzy_mhmhmh/c语言学习 - Gitee.com

我们发现vs上面的memcpy函数也可以实现重叠内存的拷贝。而在C语言标准中规定memcpy函数只要能实现不重叠的拷贝就行,而重叠的拷贝交给memmove,虽然在vs编译器上面可以完成但并不代表其他编译器也可以做到。

3.memset函数

    顾名思义为内存设置函数

(1)函数原型:void * memset ( void * ptr , int value , size_t num );

ptr的意思是一个要被填充的内存块的指针,value是你要设置内存的值是什么,size_t num 是你要设置内容的字节数。

(2)memset函数是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

    举例一下:

使用的时候需要注意以字节为单位即可。

4.memcmp函数

    顾名思义为内存比较函数

(1)函数原型:int memcmp ( const void * ptr1 , const void * prt2 , size_t num);

 这个函数的返回值和对应的结果与strcmp是一样的。但是这个函数比较的是内存块,不像strcmp一样仅仅局限于字符串的比较。其中的size_t num当然是你要比较的字节数。

(2)函数使用比较简单,就不再过多举例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值