Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 记忆重叠是不可理解的_C_Memcpy - Fatal编程技术网

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开始。好吧,我想,也许它以某种方式从已经构建的新字符串中提取字符。然后像这样放置7
memcpy(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字节组使用字操作,然后对剩余的字节一次操作一个字节。