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值的比较
四个函数已全部 整理完 有什么不懂得地方可以私信我,
谢谢你的到来!!!
江小明