memcpy - kopiuje obszar pamięci
Standardowa biblioteka C (
libc,
-lc)
#include <string.h>
void *memcpy(void dest[restrict .n], const void src[restrict .n],
size_t n);
Funkcja
memcpy() kopiuje
n bajtów z obszaru pamięci
src do obszaru pamięci
dest. Obszary te nie mogą
na siebie nachodzić. Jeżeli obszary pamięci na siebie
nachodzą, należy używać
memmove(3).
Funkcja
memcpy() zwraca wskaźnik do
dest.
Informacje o pojęciach używanych w tym rozdziale można
znaleźć w podręczniku
attributes(7).
Interfejs |
Atrybut |
Wartość |
memcpy() |
Bezpieczeństwo wątkowe |
MT-Safe |
POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD.
Zignorowanie wymogu nienachodzenia na siebie obszarów pamięci jest
źródłem istotnych błędów (Standardy
POSIX i C jednoznacznie określają, że wykorzystanie
memcpy() z nachodzącymi na siebie obszarami pamięciami
daje niezdefiniowane zachowanie). Co więcej, w glibc 2.13 na
niektórych platformach (w tym x86-64) przeprowadzana jest optymalizacja
wydajności
memcpy() obejmująca zmianę
kolejności kopiowania bajtów z
src do
dest.
Zmiana ta ujawniła poważne błędy w wielu aplikacjach
przeprowadzających kopiowania na nachodzących obszarach
pamięci. W poprzedniej implementacji, w której
kolejność kopiowanych bajtów szczęśliwie
ukrywała ten błąd, który odsłonił
się po jej odwróceniu. W glibc 2.14 dodano wersjonowany symbol,
dzięki czemu stare pliki binarne (zlinkowane z glibc w wersji
wcześniejszej niż 2.14) korzystają z implementacji
memcpy() która w sposób bezpieczny obsługuje
przypadek nachodzących obszarów pamięci
(udostępniając "starszą" implementację
memcpy(), która była aliasem
memmove(3)).
bcopy(3),
bstring(3),
memccpy(3),
memmove(3),
mempcpy(3),
strcpy(3),
strncpy(3),
wmemcpy(3)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Jarosław Beczek <
[email protected]>, Andrzej
Krzysztofowicz <
[email protected]>, Robert Luberda
<
[email protected]> i Michał Kułach
<
[email protected]>
Niniejsze tłumaczenie jest wolną dokumentacją.
Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z
GNU
General Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy
zgłaszać na adres listy dyskusyjnej
[email protected]