Nie będę naprawdę myślał o funkcjach string.h
jako "pamięci". Zamiast tego uważałbym je za funkcje "tablicowe", ponieważ działają one na danych zawartych w sekwencjach pamięci. Natomiast, malloc
(i inne), faktycznie zapewniają usługi pamięci, takie jak przydzielanie, zamiast manipulowania danymi w regionie pamięci.
W szczególności funkcje w string.h
nie zajmują się przydzielaniem lub zwalnianiem pamięci lub jakąkolwiek formą zarządzania pamięcią. Nawet funkcja taka jak char * strerror(int)
, która wydaje się tworzyć cały nowy ciąg, nie wykonuje żadnych alokacji, ponieważ zwracana wartość jest w rzeczywistości statycznie przydzielonym łańcuchem. Pozostałe funkcje mogą zwrócić wskaźnik do bloku pamięci, ale jest to właściwie jeden z ich parametrów (np. memcpy
). Lub zwracają wskaźnik do początku pod-ciągu znaków (strtok
) lub liczby całkowitej reprezentującej porównanie (memcmp
).
Z drugiej strony, stdlib.h
również nie zajmuje się pamięcią. Projekt stdlib.h
ma na celu zapewnienie operacji ogólnego przeznaczenia, których prawdopodobnie będzie potrzebować duża liczba programów. Funkcje pamięci są tylko przykładami takich podstawowych operacji. Jednak inne funkcje, takie jak exit
i system
są również dobrymi przykładami, ale nie dotyczą pamięci.
Teraz istnieją pewne funkcje w stdlib.h
które IMO mogło być umieszczone w string.h
, szczególnie różne funkcje konwersji (mbstowcs
, wcstombs
, atoi
, strtod
, etc.), a może nawet funkcje bsearch
i qsort
. Funkcje te są zgodne z tymi samymi zasadami, co funkcje string.h
(działają na tablicach, nie zwracają nowo przydzielonych bloków pamięci itp.).
Ale z praktycznego punktu widzenia, nawet jeśli popełnił wiele sensu łączyć funkcje mem*
z funkcjami malloc
, realloc
, calloc
i free
, biblioteka standardowa C jest nigdy będzie zreorganizowany tak. Taka zmiana zdecydowanie złamałaby kod. Ponadto, stdlib.h
i string.h
istnieją od tak dawna i są zarówno użytecznymi, jak i podstawowymi bibliotekami, które prawdopodobnie spowodowałyby najwięcej (lub przynajmniej dużo) zmian kodu.
To wygląda na problem z implementacją biblioteki C, z której korzystasz. Inna biblioteka C może przenieść memcpy na stdlib. – AgA
'malloc' i rodzina zajmują się dynamicznym przydzielaniem pamięci. 'memcpy' i rodzina radzą sobie z sekwencjami bajtów. 'strcpy' i rodzina również zajmują się sekwencjami bajtów, w nieco inny sposób. –
@AgA: Jeśli biblioteka C jest zgodna ze standardem ISO, to 'memcpy' będzie w' string.h', a nie 'stdlib.h'. – Blastfurnace