C语言内存函数详解

本文详细介绍了C语言中的内存操作函数,包括memcpy、strcpy、memmove和memset,以及它们的使用场景、参数解析和内存重叠问题的处理。同时提及了memcmp函数用于字节比较。
摘要由CSDN通过智能技术生成

C语言内存函数包含memcpy memmove memset memcmp等 在这里主要以这四个为主

memcpy函数 和strcpy函数差不多 都是把一个数组的东西拷贝到另外一个数组里面 

void * memcpy ( void * destination, const void * source, size_t num )

首先来看他的返回类型是void* 也就是说这个函数可以对任意的类型的数据进行拷贝

   再看他的参数 意思是从source开始的位置拷贝num个元素到destination中去 

这个函数遇到\0不会停止 如果source和destination有任何的重叠,复制的结果都是未定义的

我们自己实现一个走进他的内部一看究竟

上来先断言一下我们选择的两个空间是否为空指针 拷贝的时候是以字节为单位的

我们以拷贝字符串为例子 比如上面的 我们要把s2中的元素拷贝到s1中去 cdfgrh一个6个字符也就是6个字节 当拷贝的时候也就是一个字节一个字节的进行拷贝所以循环的时候num--就可以了 也就是有几个字节就拷贝多少个字节 因为dest和source两个形参都是void*类型的所以要强制转换成char*类型的然后对其解引用在进行拷贝 拷贝完一个后两个地址都要向后走一步 要记得要转换类型后才能向后走 不要写成 (char*)dest++ 这种写法是错误的 一定要先转换后++((char*)dest)++;返回的时候返回dest的其实地址即可 在前面可以写一个char*类型的指针记住dest的其实地址 在最后返回即可 上面的例子我没写接收值只是调用了函数所以不影响 但为了确保程序的完整性 一定要返回的是起始地址 当是整型类型的数据时 就要计算一下有多少个字节。传参的时候就要传几个字节 记住一点目标空间一定要足够不然会出现越界的情况

什么是内存重叠 举个例子

int a[] = {1,2,3,4,5,6,7,8,9} 要把a里面的1,2拷贝给他自己拷贝4个元素,拷贝的地址从3开始

他就会出现这种情况

 

这种情况也就是所谓的内存重叠 拷贝4个元素当拷贝到第三个元素时 第三个元素已经变成1了所以5的位置就变成1而不是;

这是我们自己制作的memcpy函数 库函数里面的memcpy不会出现这种情况 具体他怎么写的我们也是不太清楚 不够逻辑都和我们写的这个差不多

所以当遇到内存重叠的时候我们考虑用memmove这个函数 这个函数就彻底解决了这个问题

memmove函数

memmove函数功能和memcpy是一样的,只是它解决了内存重叠的问题

拷贝数据的时候有以下这三种情况

如果又不懂的地方请与我联系 谢谢   

代码快的实现

这里提一下 从后往前

就拿字符串来说 比如要拷贝5个元素 第一个元素加上num后地址就变成最后一个的了 num--每次都往前面挪一个

所以当遇到内存重叠时就用memmove函数 

memset函数 是用来设置内存的 一字节为单位设置成想要的内容

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

第一个填要设置的地址 第二个填设置的内容 第三个填设置几个元素

memcmp 函数

int memcmp ( const void * ptr1, const void * ptr2, size_t num )

⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节

这个函数比较简单  主要还是知道他比较的原理还是ASCLL值的比较

四个函数已全部 整理完 有什么不懂得地方可以私信我,

谢谢你的到来!!!

                                                                                                                         江小明

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值