memcpy部分复制自己

时间:2011-03-15 11:59:35

标签: c memcpy

这可以吗?

char buf[] = { 0, 1, 2 };
memcpy(buf, buf + 1, 2);

拥有更大的数据类型会有什么不同吗?我知道我可以使用memmove(),但我只是好奇。

4 个答案:

答案 0 :(得分:12)

当输入和输出重叠时,未定义memcpy的效果。您应该使用memmove

答案 1 :(得分:5)

不行。 必须在源和目标重叠时使用memmove

可能memcpy一起使用,具体取决于编译器的实现,但这不是你应该依赖的东西!


典型的天真实现可能是逐字节副本(uint8),如下所示:

typedef unsigned char uint8;

void * memcpy ( void * destination, const void * source, size_t num )
{
    const uint8* pSrc = (const uint8*)source;
    const uint8* const pSrcEnd = pSrc + num;
    uint8* pDst = (uint8*)destination;

    while (pSrc != pSrcEnd)
        *(pDst++) = *(pSrc++);

    return destination;
}

哪个适用于您的memcpy(buf, buf + 1, 2),但不太适合memcpy(buf + 1, buf, 2)

答案 2 :(得分:3)

如果内存区域重叠,则行为未定义,因此不行。

答案 3 :(得分:1)

这是未定义的行为,但我已经像这样使用了它,

char buf[] = {0, 1, 2, 3);
memcpy(buf, buf+2, 2);

目的地的终点小于源的起点。 你应该仍然使用memmove确保...