今天学习了memcpy和memmove函数,如果两个数组的内存区域有重叠的部分,那么memcpy在处理这样的数组时,有可能会发生错误,而memmove能够处理这样的问题。
1、 在需要拷贝数组的时候,到底是先择memcpy还是选择memmvoe? 功能一样,我到底用哪个?
2、怎样判断两个指针所指的区域有没有重叠? 我怎么就一眼能看出来有重叠?
谢谢!
memmove和memcpy函数👉https://blog.csdn.net/muxuen/article/details/122691244
memmove和memcpy函数的区别及实现:https://blog.csdn.net/gogogo_sky/article/details/72593513
内存区域重叠是指内存区域[src, src+count)
和内存区域[dst, dst+count)
有重叠。memcpy
只是简单的内存拷贝,没有考虑内存有重叠的情况,如果内存有重叠,其行为是undefined。而memmove
考虑内存重叠的情况,即使内存有重叠也能正常拷贝。一般来说,如果自己能确定拷贝内存没有重叠,用memcpy
比用memmove
更高效,如果有重叠,则只能用memmove
(1)memcpy()函数是从前向后拷贝;假如出现内存重叠的现象;拷贝结果可能出错;
(2)memmove()函数在memcpy()函数的基础上加入了对内存重叠拷贝的处理;引入了倒序拷贝的方式处理内存重叠的某些状况;保证拷贝的正确性;
memmove函数的功能同memcpy基本一致,可是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝,在现实中使用memmove()函数会比较好一点
操作中我们要判断的有重叠的话那肯定是mommove函数,其实c中memcpy只需要完成拷贝的任务,不考虑重叠,但是在c中已经完善了这个功能,发展中memmcpy可以说是memmove的前身。使用时更推荐使用memmove,因为他更加完善,不必要考虑更多
void* my_memmove(void* dst, const void* src, size_t n)
{
char* s_dst;
char* s_src;
s_dst = (char*)dst;
s_src = (char*)src;
if(s_dst>s_src && (s_src+n>s_dst)) { //-------------------------第二种内存覆盖的情形。
s_dst = s_dst+n-1;
s_src = s_src+n-1;
while(n--) {
*s_dst-- = *s_src--;
}
}else {
while(n--) {
*s_dst++ = *s_src++;
}
}
return dst;
}
这个函数就是判断,从后面开始复制
https://blog.csdn.net/qq_38131333/article/details/81210568
可以看看源码的解释,一般判断内存是否重叠用的是指针