使用memcpy时重叠的含义

时间:2017-03-29 08:18:52

标签: c overlap memcpy

我正在尝试理解在C库memcpy()中定义的函数<string.h>

语法:void *memcpy(void*dst,const void*src,size_t n);

我知道这个函数用于将指针src指向的内存的内容复制到dst指针指向的位置,并返回dst指针指向的地址。

我无法理解以下关于memcpy()的重要声明:

  • 使用memcpy()时,内存地址不应重叠,如果重叠,则memcpy()未定义。

另一个问题是: 传递给函数的第三个参数的值,即size_t n是否总是一个整数值?

3 个答案:

答案 0 :(得分:10)

从评论中你的问题是你不明白什么&#34;重叠&#34;的意思是:

重叠意味着:

此处两个内存区域srcdst重叠:

enter image description here

但在这里他们没有:

enter image description here

因此,如果您的内存区域重叠,则无法使用memcpy,但必须使用memmove

第二个问题:

是的,size_t是无符号整数类型。第三个参数是要复制的字节数,因此它几乎不能是无符号整数类型。

答案 1 :(得分:1)

memcpy不会使用任何临时内存从 src 复制到 dst

让我们说:

  • src启动@ 104
  • dst启动@ 108
  • src = "abcdefgh"

然后'a' @ 104 'e' @ 108

假设char为1个字节,然后复制:

  • dst = "abcdabcd"

由于n表示要复制的长度,因此它应始终为整数。

要复制重叠区域,可以使用memmove功能使用临时内存进行复制。

答案 2 :(得分:0)

*) memcpy和memmove之间的主要区别在于,memcpy在同一字符串上工作,但是memmove通过获取字符串的副本在单独的内存中工作。
*) 因此,在memcpy中发生重叠。
让我用一个例子来解释一下。
我使用了一个字符数组:

char s[20]="alightechs";

如果我分别执行以下操作,

memmove(s+5,s,7);  
memcpy(s+5,s,7); 



o/p for memmove is alighalighte  
o/p for memmove is alighalighal  

因为移动或复制都逐字节进行。
直到alighaligh,这两种情况都没有问题,因为dest = alighte(7是要复制/移动的字符数),
在memcpy我要从第5个位置进行复印时

alightechs   
alighaechs  
alighalchs  
alighalihs  
alighaligs  
alighaligh  

到这里都没问题,它可以复制(5个字母)
例如,memcpy使用相同的字符串,第6个字母将为 a ,而第7个字母将为 l
即,每次字符串更新时都会导致未定义的o / p,如下所示
在复制第6个字母时,
更新后的字符串为s [20] = alighaligh
所以我们现在得到

alighaligha  
alighalighal