Я читал из ссылки C ++ о memcpy
а также memmove
и они, кажется, делают то же самое, за исключением того, что memmove
имеет особую мысль, называемую (позволяя назначению и источнику перекрываться).
Что перекрывается и когда это происходит?
Это очень просто. Рассматривать memmove(dest, source, length)
,
Если диапазон байтов указан диапазоном source
в source + length - 1
включать любые байты в диапазоне, указанном dest
в dest + length - 1
, два диапазона перекрываются.
Это наиболее вероятно, когда происходит перемещение элементов в массиве. Пример:
// Slide array down by one:
char array[N];
memmove( (void*) &array[0], (void*) &array[1], N - 1 );
Это накладывается на элементы с 1 по N-2. Скольжение в другом направлении имеет аналогичное перекрытие:
// Slide array up by one:
memmove( (void*) &array[1], (void*) &array[0], N - 1 );
Если бы вы попытались эту же операцию с memcpy()
, результирующее поведение не определено. Немного реализации будут работать правильно, если вы используете memcpy
в обоих примерах выше. Другие потерпят неудачу для одного или обоих из двух, если вы используете memcpy
здесь вместо memmove
, Это является следствием того факта, что C и C ++ оставляют поведение неопределенным для memcpy()
когда диапазоны перекрываются, как это.
Других решений пока нет …