C:memcpy改变指针?

时间:2013-04-22 12:18:55

标签: c

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

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

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

根据this来源,它没有。

答案 3 :(得分:0)

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

来自valgrind - 手册

的示例
==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标准的措辞如下:“如果在重叠的对象之间进行复制,则行为未定义。”因此,重叠的副本违反了标准。

同样看here

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. 

答案 4 :(得分:0)

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

如果两个内存块以任何方式重叠,则不应使用

memcpy 。在这种情况下,应使用memmove

答案 5 :(得分:0)

memcpy()的原型是

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

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