2010-09-03 2 views

ответ

5

«Перекрытие памяти» не происходит само по себе. Вы можете предоставить функцию memmove с областями памяти, которые перекрываются. Возьмите два указателя в тот же массив, и вы можете легко получить перекрывающиеся области памяти.

Конечно, вы также можете легко создавать перекрывающиеся объекты через соединения.

Непонятно, что вы подразумеваете под второй частью вопроса («как эта функция может копировать блок памяти правильно»). Где вы видите проблему здесь?

+0

Я не понимаю, как проблема с перекрытием памяти описаний функции –

+0

Работает так, как если бы источник был скопирован в другой буфер, а затем скопирован в пункт назначения. Memcpy() копирует источник в пункт назначения напрямую. – Jefferson

3
memmove(p+1, p, 42); 

Для чего требуется перемещение байтов, начиная с конца. Memcpy() делает беспорядок.

+0

Строго говоря, 'memcpy' имеет неопределенное поведение, если используется таким образом. Это могло бы работать, например, если бы оно было написано, если бы повторное копирование было быстрее или если memcpy был просто реализован как призыв к memmove, но вы никогда не должны полагаться на такие вещи. :-) –

+0

Зачем использовать memcpy, если он знает memmove;) –

+0

Потому что memcpy() быстрее. –