这可以吗?
char buf[] = { 0, 1, 2 };
memcpy(buf, buf + 1, 2);
拥有更大的数据类型会有什么不同吗?我知道我可以使用memmove(),但我只是好奇。
答案 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确保...