Старый ответ
Вы хотите memmove()
.Полное описание:
Функция memmove () должна копировать n байтов из объекта, на который указывает s2, в объект, на который указывает s1.Копирование происходит так, как будто n байтов из объекта, на который указывает s2, сначала копируются во временный массив из n байтов, который не перекрывает объекты, на которые указывают s1 и s2, а затем n байтов из временного массива копируются вобъект, на который указывает s1.
со страницы memcpy()
:
Если копирование происходит между перекрывающимися объектами, поведениене определено.
Вы все равно должны использовать memmove()
.Это потому, что результат использования memcpy()
не является надежным в любом случае.
Соответствующие биты для фактического вопроса
Вы спрашиваете memcpy(ptr + 4, ptr, 8);
, который говорит, что скопируйте 8 байтов из ptr
и поместите их в ptr+4
.ptr
- 123400000000, первые 8 байтов - 1234000, поэтому он делает это:
Original : 123400000000
Writes : 12340000
Result : 123412340000
Вам нужно позвонить:
memcpy(ptr+4, ptr, 4);
memcpy(ptr+8, ptr, 4);
Чтобы достичь того, что выпосле.Или реализовать эквивалент.Это должно сделать это, но это не проверено и эквивалентно memcpy;вам нужно будет либо добавить дополнительный временный буфер, либо использовать две непересекающиеся области памяти.
void memexpand(void* result, const void* start,
const uint64_t cycle, const uint64_t limit)
{
uint64_t count = 0;
uint8_t* source = start;
uint8_t* dest = result;
while ( count < limit )
{
*dest = *source;
dest++;
count++;
if ( count % cycle == 0 )
{
source = start;
}
else
{
source++;
}
}
}