Чтение онлайн

на главную

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

void *memccpy(void *dest, const void *src, int val, size_t count);

int memcmp(const void *buf1, const void *buf2, size_t count);

void *memchr(const void *buf, int val, size_t count);

12.2.1. Заполнение памяти:

memset

Функция

memset
копирует значение val (интерпретируемое как
unsigned char
) в первые
count
байтов буфера
buf
. Она особенно полезна
для обнуления блоков динамической памяти:

void *p = malloc(count);

if (p != NULL)

 memset(p, 0, count);

Однако

memset
может использоваться с любой разновидностью памяти, не только с динамической. Возвращаемым значением является первый аргумент:
buf
.

12.2.2. Копирование памяти:

memcpy
,
memmove
и
memccpy

Три функции копируют один блок памяти в другой. Первые две функции отличаются в обработке перекрывающихся областей памяти; третья копирует память, но останавливается при встрече с определенным значением.

void *memcpy(void *dest, const void *src, size_t count)

Это простейшая функция. Она копирует

count
байтов из
src
в
dest
. Она не обрабатывает перекрывающиеся области памяти. Функция возвращает
dest
.

void *memmove(void *dest, const void *src, size_t count)

Подобно

memcpy
, она также копирует
count
байтов из
src
в
dest
. Однако, она обрабатывает перекрывающиеся области памяти. Функция возвращает
dest
.

void *memccpy(void *dest, const void *src, int val, size_t count)

Эта копирует байты из

src
в
dest
, останавливаясь либо после копирования
val
в
dest
, либо после копирования
count
байтов. Если она находит
val
, то возвращает указатель на положение в
dest
сразу за
val
. В противном случае возвращается
NULL
.

Теперь, в чем проблема с перекрывающейся памятью? Рассмотрим рис. 12.1.

Рис. 12.1. Перекрывающиеся копии

Целью является скопировать четыре экземпляра

struct xyz
от
data[0]
до
data[3]
в участок от
data[3]
до
data[6]
. Здесь проблемой является
data[3]
, побайтовое копирование с перемещением в памяти из
data[0]
затрет
data[3]
до того, как он будет безопасно скопирован в
data[6]
! (Может возникнуть также сценарий, когда копирование в памяти в обратном направлении разрушит перекрывающиеся данные.)

Функция

memcpy
была первоначальной функцией в System V API для копирования блоков памяти; ее поведение для перекрывающихся блоков памяти не была подробно определена тем или иным способом. Для стандарта С 1989 г. комитет почувствовал, что это отсутствие определенности является проблемой, поэтому они придумали
memmove
. Для обратной совместимости
memcpy
была оставлена, причем поведение для перекрывающейся памяти было специально отмечено как неопределенное, а в качестве процедуры, корректно разрешающей проблемные случаи, была предложена
memmove
.

Какую из них использовать в своем коде? Для библиотечной функции, которая не знает, какие области памяти ей передаются, следует использовать

memmove
. Таким способом вы гарантируете, что не будет проблем с перекрывающимися областями. Для кода приложения, который «знает», что две области не перекрываются, можно безопасно использовать
memcpy
.

Как для

memcpy
, так и для
memmove
(как и для
strcpy
) буфер назначения является первым аргументом, а источник — вторым. Чтобы запомнить это, обратите внимание на порядок, который тот же самый, как в операторе присваивания:

dest = src;

(Справочные страницы во многих системах не помогают, предлагая прототип в виде '

void *memcpy(void *buf1, void *buf2, size_t n)
' и полагаясь на то, что текст объяснит, что есть что. К счастью, справочная страница GNU/Linux использует более осмысленные имена.)

12.2.3. Сравнение блоков памяти:

memcmp

Функция

memcmp
сравнивает
count
байтов из двух произвольных буферов данных. Возвращаемое ею значение подобно
strcmp
: отрицательное, нулевое или положительное, если первый буфер меньше, равен или больше второго.

Вы можете поинтересоваться: «Почему бы не использовать для такого сравнения

strcmp
?» Разница между двумя функциями в том, что
memcmp
не принимает во внимание нулевые байты (завершающий строку '
\0
'.) Таким образом,
memcmp
является функцией, которая используется, когда вам нужно сравнить произвольные двоичные данные.

Другим преимуществом

memcmp
является то, что она быстрее типичной реализации на C:

/* memcmp --- пример реализации на С, НЕ для реального использования */

int memcmp(const void *buf1, const void *buf2, size_t count) {

 const unsigned char *cp1 = (const unsigned char*)buf1;

 const unsigned char *cp2 = (const unsigned char*)buf2;

 int diff;

 while (count-- != 0) {

diff = *cp1++ - *cp2++;

if (diff != 0)

return diff;

 }

 return 0;

}

Поделиться:
Популярные книги

Измена. За что ты так со мной

Дали Мила
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. За что ты так со мной

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Большие дела

Ромов Дмитрий
7. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Большие дела

Эксклюзив

Юнина Наталья
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Эксклюзив

И только смерть разлучит нас

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
И только смерть разлучит нас

Черкес. Дебют двойного агента в Стамбуле

Greko
1. Черкес
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черкес. Дебют двойного агента в Стамбуле

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Третье правило дворянина

Герда Александр
3. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Третье правило дворянина

Ваантан

Кораблев Родион
10. Другая сторона
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Ваантан

Невеста

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
8.54
рейтинг книги
Невеста

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Кодекс Крови. Книга ХII

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Бальмануг. (Не) Любовница 2

Лашина Полина
4. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 2