Подтвердить что ты не робот

Почему функции памяти, такие как memset, memchr... находятся в string.h, но не в stdlib.h с другими функциями mem?

Интересно, почему такая функция как:
-memset
-memmov
-memchr
-memcpy

Exist в файле заголовка string.h, но не в файле stdlib.h, где есть другие стандартные функции памяти в качестве распределения динамической памяти: malloc, calloc, realloc, free.

Может быть, было бы лучше объединить их в один заголовок? Что вы думаете об этом? Я не понимаю, почему один набор функций памяти отделен от других и существует в заголовке строки (string.h).

4b9b3361

Ответ 1

Потому что фактически string.h определяется как стандартный заголовок, который объявляет функции, обрабатывающие массив символов, а не только строки. Такие функции, как memcpy и memset, принимают аргументы, которые рассматриваются как указатели на первый элемент объекта массива типов символов.

(C99, 7.21.1p1) Заголовок < string.h > объявляет один тип и несколько функций и определяет один макрос, полезный для манипулирования массивами типа символа и других объектов, рассматриваемых как массивы типа символа.

Ответ 2

Я бы не думал о функциях string.h как функции "памяти". Вместо этого я бы назвал их "функциями массива", поскольку они работают с данными, содержащимися в последовательности памяти. Напротив, malloc (и другие) фактически предоставляют службы памяти, такие как распределение, а не манипулирование данными в области памяти.

В частности, функции в string.h не заботятся ни о каком распределении или освобождении памяти или о какой-либо форме управления памятью. Даже такая функция, как char * strerror(int), которая, как представляется, создает целую новую строку, не выполняет никаких распределений, потому что возвращаемое значение на самом деле является статически выделенной строкой. Другие функции могут возвращать указатель на блок памяти, но на самом деле это всего лишь один из их параметров (например, memcpy). Или они возвращают указатель на начало подстроки (strtok) или целое число, представляющее сравнение (memcmp).

С другой стороны, stdlib.h также не относится к памяти. Конструкция stdlib.h заключается в предоставлении операций общего назначения, которые, вероятно, потребуют большого количества программ. Функции памяти просто являются примерами таких фундаментальных операций. Однако другие функции, такие как exit и system, также являются хорошими примерами, но не относятся к памяти.

Теперь в stdlib.h есть некоторые функции, которые ИМО мог бы быть помещен в string.h, в частности различные функции преобразования (mbstowcs, wcstombs, atoi, strtod и т.д.), и возможно, даже функции bsearch и qsort. Эти функции следуют тем же принципам, что и функции string.h (они работают с массивами, не возвращают вновь выделенные блоки памяти и т.д.).

Но с практической точки зрения, даже если было бы разумно объединить функции mem* с функциями malloc, realloc, calloc и free, стандартная библиотека C никогда не будет для такой реорганизации. Такое изменение, безусловно, нарушит код. Кроме того, stdlib.h и string.h существуют так долго и являются как полезными, так и фундаментальными библиотеками, что изменения, вероятно, нарушат большинство (или, по крайней мере, много) C-кода.

Ответ 3

В Pre-Standard C эти функции были действительно определены где-то в другом месте, но ни в stdlib.h ни в любом другом стандартном заголовке, а в memory.h. Он все еще может существовать в вашей системе, он, безусловно, по-прежнему работает на OS X (на сегодняшний день).

memory.h в OS X 10.11 (без заголовка лицензии):

#include <string.h>

Весь файл находится только #include 'ing string.h, чтобы сохранить обратную совместимость с программами Pre-Standard C.