memcpy - копирует
участок
памяти
Standard C library (
libc,
-lc)
#include <string.h>
void *memcpy(void dest[restrict .n], const void src[restrict .n],
size_t n);
Функция
memcpy()
копирует
n
байт из
участка
памяти
src в
участок
памяти
dest.
Адреса
участков
памяти не
должны
перекрываться
друг
другом.
Если это
неизбежно,
используйте
memmove(3).
Функция
memcpy()
возвращает
указатель
на
dest.
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
memcpy() |
Безвредность
в нитях |
MT-Safe |
POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD.
Несоблюдение
требования
не
перекрытия
областей
памяти
является
источником
серьёзных
ошибок (в
стандартах
POSIX и C явно
указано,
что
выполнение
memcpy() над
перекрывающимися
областями
приводит к
непредсказуемому
поведению).
Что
особенно
важно, в glibc 2.13
для
оптимизации
производительности
memcpy() на
некоторых
платформах
(включая x86-64)
изменён
порядок
копирования
байт из
src в
dest.
Это
изменение
привело к
поломкам
многих
приложений,
которые
выполняли
копирование
перекрывающихся
областей. В
предыдущей
реализации
порядок, в
котором
копировались
байты,
случайно
скрывал
ошибку,
который
выявилась
при
изменении
порядка
копирования.
В glibc 2.14 был
добавлен
символ
версии для
того, чтобы
старые
двоичные
файлы (т.е.,
скомпонованные
с версиями
glibc до 2.14)
вызывали
реализацию
memcpy(), которая
безопасно
обрабатывает
случай
перекрывающихся
буферов
(предоставляя
«старую»
реализацию
memcpy(), которая
была
просто ещё
одним
именем
memmove(3)).
bcopy(3),
bstring(3),
memccpy(3),
memmove(3),
mempcpy(3),
strcpy(3),
strncpy(3),
wmemcpy(3)
Русский
перевод
этой
страницы
руководства
был сделан
aereiae <
[email protected]>, Alexey <
[email protected]>, Azamat
Hackimov <
[email protected]>, Dmitriy S. Seregin
<
[email protected]>, Dmitry Bolkhovskikh <
[email protected]>,
ITriskTI <
[email protected]>, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]>, Иван
Павлов <
[email protected]>
и Малянов
Евгений
Викторович
<
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]