memcpy与memmove函数都是内存拷贝函数,其区别在于memcpy一般用于两组数据的拷贝;使用方法很简单。
这是memcpy函数的自主实现;返回类型为可能为任意类型的指针所以用void*定义;将两个数组内存解引用赋值就行,最后进行自增操作,注意强行转换为char*类型;这样才能保证+1跳过了一个字节;这样才能挨个字节的赋值。这个函数的实现比较简单。最后返回数组的地址即可。
接下来就是memmove函数这个函数勇于同一个数组间的拷贝,这个相对memcpy比较难理解。假设我定义了一个一到十的数组arr使用函数memmove(arr+4,arr,20);此时20字节代表我要拷贝5个整型数字;结果会是
那这与memcpy有什么差别呢?看下图memcpy的运行结果
这个例子是第9个数字上的差别;原因是什么呢?其实memcpy函数运行出来的这个是一个错误的结果。因为从第5个数字开始后面的数字拷贝了原数组的前五位,那这样说的话第9位数应该是5才对如memmove的运行结果,为什么用memcpy会这样呢?是因为原数组第五位数已经拷贝了原数组的第一位数字1;那此时的第五位数字已经是1了;所以第9位数字在拷贝的时候变成了第五位的1;这并不是我们想要的结果;但memmove函数可以进行这一操作,避免重叠拷贝,这就是memcpy与memmove的真正差别。那我们现在开始进行memmove函数的实现。如下图 毕竟都是拷贝,那方法都是大同小异,当dest的地址在src的前面时memmove与memcpy的原理相同所以代码完全一样;这种情况不会重叠拷贝。当dest的地址在src的后面时当拷贝的字节多时可能出现重叠拷贝。所以方法不同,为了避免重叠拷贝,我们可以从后面开始拷贝,也就完成了这个函数的自主实现。代码已呈现,memmove函数第二种情况的实现可以自己再下去理解一下,再想想这样才能彻底理解,那就这样。