Non vorrei davvero pensare alle funzioni string.h
come a funzioni di "memoria". Invece, li considererei come funzioni "array", poiché operano sui dati contenuti nelle sequenze di memoria. Al contrario, malloc
(e altri), in realtà forniscono servizi di memoria come l'allocazione, piuttosto che la manipolazione dei dati all'interno di una regione di memoria.
In particolare, le funzioni in string.h
non si occupano di allocazioni o deallocuzioni di memoria o di qualsiasi forma di gestione della memoria. Anche una funzione come char * strerror(int)
, che sembra creare un'intera nuova stringa, non esegue alcuna allocazione, poiché il valore restituito è in realtà una stringa allocata staticamente. Le altre funzioni potrebbero restituire un puntatore a un blocco di memoria, ma questo è in realtà solo uno dei loro parametri (ad esempio memcpy
). Oppure restituiscono un puntatore all'inizio di una sottostringa (strtok
) o un numero intero che rappresenta un confronto (memcmp
).
D'altra parte, stdlib.h
non si riferisce alla memoria. Il design di stdlib.h
è quello di fornire operazioni di carattere generale che necessitano di un numero elevato di programmi. Le funzioni di memoria sono solo esempi di operazioni fondamentali. Tuttavia, altre funzioni come exit
e system
sono anche buoni esempi, ma non si applicano alla memoria.
Ora ci sono alcune funzioni in stdlib.h
che IMO possa essere posizionata in string.h
, in particolare le varie funzioni di conversione (mbstowcs
, wcstombs
, atoi
, strtod
, ecc), e forse anche le bsearch
e qsort
funzioni. Queste funzioni seguono gli stessi principi delle funzioni string.h
(funzionano sugli array, non restituiscono blocchi di memoria appena allocati, ecc.).
Ma da un punto di vista pratico, anche se ha fatto un sacco di senso di combinare le funzioni mem*
con le funzioni malloc
, realloc
, calloc
e free
, la libreria standard C è mai intenzione di essere riorganizzato come questo. Un tale cambiamento avrebbe sicuramente infranto il codice. Inoltre, stdlib.h
e string.h
sono in circolazione da così tanto tempo, e sono entrambe librerie utili e fondamentali, che le modifiche probabilmente infrangerebbero la maggior parte (o almeno un sacco) codice C.
Questo sembra un problema di implementazione con la libreria C che si sta utilizzando. Altre librerie C possono scegliere di spostare memcpy in stdlib. – AgA
'malloc' e famiglia occupano l'allocazione dinamica della memoria. 'memcpy' e la famiglia si occupano di sequenze di byte. 'strcpy' e la famiglia si occupano anche di sequenze di byte, in un modo leggermente diverso. –
@AgA: se una libreria C è conforme allo standard ISO allora 'memcpy' sarà in' string.h', non 'stdlib.h'. – Blastfurnace