-5

如果指针引用的数据也在范围内,是否memcpy调整指向复制数据的指针memcpy?(我假设不是,但永远不知道......)

因此,假设,例如,将指针复制到该指针所引用的内容。问题是:指针是被无声地复制(即没有改变)还是被调整为指向新复制的内容?

4

6 回答 6

4

不,memcpy 盲目地将 x 字节从源复制到目标。

参见例如: http: //man7.org/linux/man-pages/man3/memcpy.3.html

于 2013-04-22T12:20:41.763 回答
1

memcpy不修改任何指针;它只修改dst参数指向的内存块的内容。

memcpy 如果两个内存块以任何方式重叠,则不应使用。在这种情况下memmove应该使用。

于 2013-04-22T12:21:58.630 回答
0

根据标准,如果源指针和目标指针重叠,则行为是未定义的。

来自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. 
于 2013-04-22T12:21:36.590 回答
0

的原型memcpy()

 void * memcpy ( void * destination, const void * source, size_t num );

它将num字节的值从source指向的位置直接复制到destination指向的内存块。它返回一个指向目标的指针。

于 2013-04-22T12:22:05.287 回答
0

memcpy内部执行的操作超出了规范的范围。在外部,对任何指针的任何更改都是不可见的,因为memcpy它使用作为参数传递的指针的副本。

于 2013-04-22T12:21:07.567 回答
0

根据这个来源,它没有。

于 2013-04-22T12:21:26.060 回答