Прототип функции memmove:
void * memmove( void * destptr, const void * srcptr, size_t num );
Заголовочный файл:
Название | Язык |
---|---|
string.h | С |
cstring | С++ |
Описание
Переместить блок памяти. Функция копирует num
байтов из блока памяти источника, на который ссылается указатель srcptr
, в блок памяти назначения, на который указывает указатель destptr
. Копирование происходит через промежуточный буфер, что, в свою очередь, не позволяет destination
и srcptr
пересекаться.
Тип данных объектов, на которые указывают как srcptr
так и destptr
не имеют никакого значения. Так как эта функция работает с бинарными данными. Функция не проверяет, есть ли символ завершения в srcptr
, она всегда копирует количество байтов, указанное в num
. Чтобы избежать переполнения блока памяти destptr
, размер destptr
должен быть не менее num
байтов. Однако, может возникнуть ситуация, когда destptr
и srcptr
пересекутся.
Параметры:
- destptr
Указатель на блок памяти назначения (куда будут копироваться байты данных), имеет тип данныхvoid
. - srcptr
Указатель на блок памяти источник (т. е., откуда будут копироваться байты данных), имеет тип данныхvoid
. - num
Количество копируемых байтов.
Возвращаемое значение
Указатель на блок памяти назначения.
Пример: исходный код программы
//пример использования функции memmove #include <iostream> #include <cstring> int main() { char str[] = "memmove может оказаться очень полезной функцией.............."; // перемещаем блок символов в памяти memmove (str + 49, // таже самая строка, со сдвигом в 49 байт str + 38, // копируем из str начиная с 38-го байта 47); // скопировать нужно 47 байт std::cout << str << std::endl; return 0; }
Комментарии
kpanat .
Ну тут ошибка… написано «Копирование происходит через промежуточный буфер, что, в свою очередь, не позволяет
destination
иsrcptr
пересекаться», а надо «Копирование происходит через промежуточный буфер, что, в свою очередь, позволяетdestination
иsrcptr
пересекаться» Такая маленькая ошибочка, которая в корне меняет смысл. Но вообще лучше использовать другую функцию для пересекающихся блоков варьируя направлением копирования… Этот параметр не входит ни в одну строковую функцию. но все функции с ним неявно работают устанавливая направление копирования всегда вперёд.Хотя к примеру для корректной вставки необходимо выполнить копирование назад… Конечно вам придётся написать свою функцию. В стандарте и расширениях такой нет.gam507
Ошибка в примере. memmove(str+49,str+38,47). Нужно memmove(str+30,str+24,23).
admin
Для nix-систем тут нет ошибки, так как для хранения русских букв требуется два байта.