常用内存函数的用法和模拟实现

这一节主要讨论是:memcpy函数的使用以及模拟实现。memmove函数的使用以及模拟实现。memset函数的使用。memcmp函数的使用

memcpy

内存函数,操作的是内存,memcpy函数是将一处指定地址处向后的指定的大小空间内的数据拷贝到另一处空间之中。这里需要注意的是两点:内存函数在拷贝过程中遇到\0不会中止拷贝。\0在这里与其他数据没有什么不同。另外一点就是memcpy在标准规定中不能进行重叠内存的拷贝。假如源数据空间与目的地空间重叠的话,我们就不能使用memcpy函数。c语言标准中规定当要进行重叠内存的拷贝时要使用memmove函数。但是在vs2022上面,memcpy是可以进行重叠内存的memcpy函数的定义是这样的:void* memcpy (void* destnation, const void* source, size_t num);内存函数需要对任意类型的数据进行拷贝,所以传递参数时,形参指针接收的是void类型的地址。同时返回的也是void类型的指针。

使用案例: 

模拟实现: 

memmove 

 memmove作用是对重叠的内存空间空间进行拷贝。c语言标准规定,memcpy进行非重叠的内存数据的拷贝,而memmove进行重叠的内存空间的拷贝。那么,为何会有这种划分呢?

原因是因为内存如果重叠,那么再进行拷贝过程中可能发生冲突。具体原因如下 

从上面可以得到一个结论,就是假如destnation的首地址大于source的首地址,那么就从后向前拷贝,反之。

接下来是模拟实现:

memset

memset主要用来数据的初始化。其定义为:

void* memset(void* ptr, int value, size_t num);

下面为运用案例: 

 

memcmp 

memcmp和strncmp比较的方式类似,只是比较的元素变成了以字节为单位,比较的是内存中的数据。而不是以一个字符为单位,比较字符。其定义是:int memcmp(const void* str1, const void* str2, size_t num);str1指向第一块内存首地址。strt2指向第二块内存首地址,num则表示str1,与str2的前num字节的内存进行比较。要注意的是,当比较时遇到\0不会中止比较。\0在这里与其他数据并无区别。当str1 指向空间大于 str2时,返回大于0的数字。当str1 指向空间小于str2时,返回小于0的数字。相等则为0.

下面为运用案例:

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值