我正在尝试理解在C库memcpy()
中定义的函数<string.h>
语法:void *memcpy(void*dst,const void*src,size_t n);
我知道这个函数用于将指针src
指向的内存的内容复制到dst
指针指向的位置,并返回dst
指针指向的地址。
我无法理解以下关于memcpy()
的重要声明:
memcpy()
时,内存地址不应重叠,如果重叠,则memcpy()
未定义。另一个问题是:
传递给函数的第三个参数的值,即size_t n
是否总是一个整数值?
答案 0 :(得分:10)
从评论中你的问题是你不明白什么&#34;重叠&#34;的意思是:
重叠意味着:
此处两个内存区域src
和dst
重叠:
但在这里他们没有:
因此,如果您的内存区域重叠,则无法使用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