如果指针引用的数据也在范围内,是否memcpy
调整指向复制数据的指针memcpy
?(我假设不是,但永远不知道......)
因此,假设,例如,将指针复制到该指针所引用的内容。问题是:指针是被无声地复制(即没有改变)还是被调整为指向新复制的内容?
如果指针引用的数据也在范围内,是否memcpy
调整指向复制数据的指针memcpy
?(我假设不是,但永远不知道......)
因此,假设,例如,将指针复制到该指针所引用的内容。问题是:指针是被无声地复制(即没有改变)还是被调整为指向新复制的内容?
不,memcpy 盲目地将 x 字节从源复制到目标。
参见例如: http: //man7.org/linux/man-pages/man3/memcpy.3.html
memcpy
不修改任何指针;它只修改dst
参数指向的内存块的内容。
memcpy
如果两个内存块以任何方式重叠,则不应使用。在这种情况下memmove
应该使用。
根据标准,如果源指针和目标指针重叠,则行为是未定义的。
来自valgrind
-manual的示例
==27492== Source and destination overlap in
memcpy(0xbffff294, 0xbffff280, 21)
==27492== at 0x40026CDC: memcpy
(mc_replace_strmem.c:71)
==27492== by 0x804865A: main (overlap.c:40)
您不希望这两个块重叠,因为其中一个块可能会被复制部分覆盖。
...
此外,对于其中许多功能,POSIX 标准的措辞类似于“如果复制发生在重叠的对象之间,则行为未定义”。因此,重叠副本违反了标准。
也看这里:
Description
The memcpy() function copies n bytes from memory area src to memory area dest.
The memory areas must not overlap. Use memmove(3) if the memory areas do overlap.
的原型memcpy()
是
void * memcpy ( void * destination, const void * source, size_t num );
它将num字节的值从source指向的位置直接复制到destination指向的内存块。它返回一个指向目标的指针。
memcpy
内部执行的操作超出了规范的范围。在外部,对任何指针的任何更改都是不可见的,因为memcpy
它使用作为参数传递的指针的副本。
根据这个来源,它没有。