Что перекрывается в определении memmove ()?

Я читал из ссылки C ++ о memcpyа также memmove и они, кажется, делают то же самое, за исключением того, что memmove имеет особую мысль, называемую (позволяя назначению и источнику перекрываться).

Что перекрывается и когда это происходит?

4

Решение

Это очень просто. Рассматривать 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() когда диапазоны перекрываются, как это.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]