我正在玩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开始。好吧,以为我,可能它以某种方式从已经构建的新字符串中获取字符。像这样memcpy(str + 5, str, 7);
放7就证实了我的假设,因为它产生了012340123401cdef
作为输出。
然而事情开始变得更加不清楚。如果我执行此操作memcpy(str + 5, str, 8);
,则会输出0123401234567def
!!!就像我从一开始就预期的那样。
我完全糊涂了。为什么这样做?好吧,我甚至可以理解打印01作为字符串的第11和第12个字符(但这不是我所期望的,我会感激解释)。但是,当我确定长度为8时,为什么会改变其行为?
我希望你明白我的意思。请提供详细说明。非常感谢提前
答案 0 :(得分:3)
memcpy
假设源和目标不重叠。如果他们这样做,任何事情都可能发生,确切地说发生了什么可能取决于你使用的编译器,编译或运行的机器,你复制的区域有多大,一天中的什么时间等等。如果你想要的话要将内存块复制到与原始位置重叠的目标位置,请使用memmove
。
答案 1 :(得分:0)