Не в порядке. Вы должны использовать 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)