C 记忆重叠是不可理解的
我玩C 记忆重叠是不可理解的,c,memcpy,C,Memcpy,我玩memcpy是为了更好地理解它的工作,我遇到了一些我不理解的事情 我从一段非常简单的代码开始: char str [] = "0123456789abcdef"; memcpy(str + 5, str, 5); puts(str);// prints 0123401234abcdef 我完全可以理解。然后我继续: char str [] = "0123456789abcdef"; memcpy(str + 5, str, 6); puts(str); // 01234012340bcde
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开始。好吧,我想,也许它以某种方式从已经构建的新字符串中提取字符。然后像这样放置7memcpy(str+5,str,7)
确认了我的假设,因为它产生了01234013401CDEF
作为输出
但后来事情开始变得越来越不明朗。如果我这样做memcpy(str+5,str,8)代码>它输出0123401234567def
!!!。就像我从一开始就期望的那样
我完全糊涂了。为什么会这样?好的,我甚至可以将打印01理解为字符串的第11个和第12个字符(但这并不是我所期望的,我将非常感谢您的解释)。但为什么当我将长度确定为8时,它会改变其行为
我希望你明白我的意思。请提供详细解释。提前多谢
memcpy
假设源和目标不重叠。如果他们这样做,任何事情都可能发生,具体发生什么可能取决于您使用的编译器、您编译或运行的机器、您复制的区域有多大、一天中的时间等。如果您想将内存块复制到与原始位置重叠的目标位置,请使用memmove
memcpy
假设源和目标不重叠。如果他们这样做,任何事情都可能发生,具体发生什么可能取决于您使用的编译器、您编译或运行的机器、您复制的区域有多大、一天中的时间等。如果您想将内存块复制到与原始位置重叠的目标位置,请使用memmove
memcpy
假设源和目标不重叠。如果他们这样做,任何事情都可能发生,具体发生什么可能取决于您使用的编译器、您编译或运行的机器、您复制的区域有多大、一天中的时间等。如果您想将内存块复制到与原始位置重叠的目标位置,请使用memmove
memcpy
假设源和目标不重叠。如果他们这样做,任何事情都可能发生,具体发生什么可能取决于您使用的编译器、您编译或运行的机器、您复制的区域有多大、一天中的时间等。如果您想将内存块复制到与原始位置重叠的目标位置,请使用memmove
进行以下操作:
[…]如果对象重叠,则行为是未定义的
对于重叠的情况,应该使用
[…]对象可能重叠:复制的发生就像将字符复制到临时字符数组,然后将字符从数组复制到dest一样
用于:
[…]如果对象重叠,则行为是未定义的
对于重叠的情况,应该使用
[…]对象可能重叠:复制的发生就像将字符复制到临时字符数组,然后将字符从数组复制到dest一样
用于:
[…]如果对象重叠,则行为是未定义的
对于重叠的情况,应该使用
[…]对象可能重叠:复制的发生就像将字符复制到临时字符数组,然后将字符从数组复制到dest一样
用于:
[…]如果对象重叠,则行为是未定义的
对于重叠的情况,应该使用
[…]对象可能重叠:复制的发生就像将字符复制到临时字符数组,然后将字符从数组复制到dest一样
在C中没有<代码> STD::/COD>,这是C++。@ BARMAR固定。谢谢。没有<代码> STD::/Cord> C,这是C++。@ BARMAR固定。谢谢。没有<代码> STD::/Cord> C,这是C++。@ BARMAR固定。谢谢。没有<代码> STD::/Cord> C,这是C++。@ BARMAR固定。谢谢。它在8改变行为的原因可能是因为代码对4字节组使用字操作,然后对剩余字节一次操作一个。它在8改变行为的原因可能是因为代码对4字节组使用字操作,然后对剩余字节一次操作一个。它在8时更改行为的原因可能是因为代码对4字节组使用字操作,然后对剩余字节一次操作一个。它在8时更改行为的原因可能是因为代码对4字节组使用字操作,然后对剩余的字节一次操作一个字节。