Функция memmove

Прототип функции 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;
}

Пример работы программы

CppStudio.com
memmove может оказаться очень очень полезной функцией…
Автор: admin
Дата: 31.08.2012
Поделиться:

Комментарии

  1. kpanat .

    Ну тут ошибка… написано «Копирование происходит через промежуточный буфер, что, в свою очередь, не позволяет destination и srcptr пересекаться», а надо «Копирование происходит через промежуточный буфер, что, в свою очередь, позволяет destination и srcptr пересекаться» Такая маленькая ошибочка, которая в корне меняет смысл. Но вообще лучше использовать другую функцию для пересекающихся блоков варьируя направлением копирования… Этот параметр не входит ни в одну строковую функцию. но все функции с ним неявно работают устанавливая направление копирования всегда вперёд.Хотя к примеру для корректной вставки необходимо выполнить копирование назад… Конечно вам придётся написать свою функцию. В стандарте и расширениях такой нет.

  2. gam507

    Ошибка в примере. memmove(str+49,str+38,47). Нужно memmove(str+30,str+24,23).

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.