This question already has an answer here:
Closed 5 years ago.
Please look into this inexplicable behavior and output of memcpy() for overlapping memory blocks
(1个答案)
我在玩memcpy是为了更好地理解它的工作,我遇到了一些我无法理解的事情。
我从一段非常简单的代码开始:
char str [] = "0123456789abcdef";
memcpy(str + 5, str, 5);
puts(str);// prints 0123401234abcdef

我完全可以理解。然后我继续:
char str [] = "0123456789abcdef";
memcpy(str + 5, str, 6);
puts(str); // 01234012340bcdef

起初,我希望输出01234012345bcdef假定函数将取前六个字符,但它又从0开始。好吧,我想,也许它以某种方式从已经构建的新字符串中提取字符。像这样放置7个memcpy(str + 5, str, 7);证实了我的假设,因为它产生了012340123401cdef作为输出。
但后来事情变得越来越不明朗。如果我这样做,它就会输出!!!就像我从一开始就预料到的那样。
我完全糊涂了。为什么会这样?好的,我甚至可以理解将01打印为字符串的第11个和第12个字符(但这不是我所期望的,我希望得到一个解释)。但是为什么当我确定长度为8时,它会改变它的行为呢???
我希望你明白我的意思。请详细解释。提前多谢了

最佳答案

The memcpy() function shall copy n bytes from the object pointed to by s2 into the object pointed to by s1. If copying takes place between objects that overlap, the behavior is undefined.
memcpy假设源和目标不重叠。如果他们这样做,任何事情都可能发生,具体发生什么可能取决于您使用的编译器、您编译或运行的机器、您要复制的区域有多大、一天中的什么时间等等。如果您要将内存块复制到与原始位置重叠的目标,请使用memmove

关于c - memcpy重叠无法理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21951416/

10-11 21:57