Манипулирование блоками памяти – стандартное расширение технологии обработки символьных строк, которое предоставляет возможность оперировать данными произвольных абстрактных типов, какие только можно адресовать в сегменте данных прикладной программы. Объектами такой обработки могут быть, например, массивы элементов различных базовых типов, любой размерности и длины, структуры и другие сложные формы образования данных. Без учета особенностей логической структуры, любой из этих объектов можно рассматривать как последовательный набор байтов, который занимает адресуемый блок памяти фиксированный длины. Для принятой трактовке организации блоков памяти, манипулирование их содержимым осуществляется в форме следующих основных операций: инициализация, копирование, сравнение и поиск данных.
Чтобы унифицировать разнообразие возможных практических реализаций этих операций манипулирования блоками памяти, система программирования C предоставляет набор стандартных функций. Имена этих функций начинаются с префикса mem, а объектный код сосредоточен в стандартной библиотеке объектных модулей системы программирования C. Прототипы их вызова могут быть декларированы в заголовочных файлах mem.h, memory.h или string.h системы программирования C. Заголовочные файлы memory.h и mem.h были введены в реализациях системы программирования C для OS Unix System V и Borland C, соответственно. Современные стандарты требуют использовать заголовочный файл string.h, который объединяет декларации прототипов функций манипулирования блоками памяти и обработки символьных строк, отражая концептуальное сходство выполняемых ими операций. Однако, любой из перечисленных файлов заголовков декларирует прототипы пяти базовых функций манипулирования блоками памяти, специфицируя типы их аргументов и кодов возврата. Это функции memset, memcpy, memmove, memcmp и memchr, которые есть в любых реализациях системы программирования C.
Для однородной инициализации блоков памяти применяется функция memset. Спецификация формата ее вызова имеет вид:
void* memset(void* mem, int code, unsigned len);
Корректный вызов этой функции обеспечивает заполнение начальных len байтов области памяти, адресуемой через указатель mem, значением кода символа, который задает младший байт параметра code. Функция memset возвращает адрес инициализированного блока памяти, то есть значение своего первого аргумента mem.
Применение функции memset поясняет следующий исходный код прикладной процедуры zero, которая обнуляет заданное число начальных байтов адресованной области память:
/* Обнуление области памяти */
void zero(void* mem, unsigned len) {
memset(mem, '\0', len);
} /* zero */