allocate - pointer malloc
¿Por qué las funciones de memoria como memset, memchr... están en string.h, pero no en stdlib.h con otras funciones de mem? (4)
Además de las consideraciones históricas, la separación de las utilidades de manipulación de datos como las de string.h
y las funciones del sistema como malloc
en stdlib.h
tiene mucho sentido cuando se consideran contextos en los que un sistema operativo no es un hecho. Los sistemas integrados pueden o no tener un RTOS y pueden tener o no una asignación de memoria estándar disponible. Sin embargo, las utilidades como strcpy
y memcpy
ocupan un espacio similar en el sentido de que no dependen de ningún sistema externo y, por lo tanto, se pueden ejecutar en cualquier contexto donde se pueda ejecutar código compilado. Conceptual y prácticamente tiene sentido unirlos y separarlos de las llamadas al sistema más complejas.
Me pregunto por qué tal función como:
-memset
-memmov
-memchr
-memcpy
Existe en el archivo de encabezado string.h, pero no en el archivo stdlib.h, donde hay otras funciones de memoria estándar como asignación de memoria dinámica: malloc, calloc, realloc, free.
¿Tal vez sería mejor unirlos en un encabezado? ¿Qué piensa usted al respecto? No entiendo por qué un conjunto de funciones de memoria están separadas de otras y existen en el encabezado de cadena (string.h).
En Pre-Estándar C, estas funciones fueron de hecho definidas en otro lugar, pero ni en stdlib.h
ni en ninguno de los otros encabezados estándar, sino en memory.h
. Todavía puede existir en su sistema, ciertamente todavía lo hace en OS X (a partir de hoy).
memory.h
en OS X 10.11 (sin encabezado de licencia):
#include <string.h>
El archivo completo es solo #include
string.h
, para mantener la compatibilidad con programas Pre-Estándar C.
Porque en realidad string.h
se define como un encabezado estándar que declara funciones que tratan una matriz de caracteres y no solo cadenas. Las funciones como memcpy
y memset
toman argumentos que se tratan como punteros al primer elemento de un objeto de tipo matriz de caracteres.
(C99, 7.21.1p1) El encabezado <cadena.h> declara un tipo y varias funciones, y define una macro útil para manipular matrices de tipo de carácter y otros objetos tratados como matrices de tipo de carácter.
Realmente no pensaría en la string.h
funciona como funciones de "memoria". En cambio, las consideraría funciones de "matriz", ya que operan sobre los datos que están contenidos en las secuencias de la memoria. Por el contrario, malloc
(y otros) realmente proporcionan servicios de memoria, como la asignación, en lugar de la manipulación de los datos dentro de una región de la memoria.
En particular, las funciones en string.h
no se ocupan de ninguna asignación o desasignación de memoria, o cualquier forma de gestión de memoria. Incluso una función como char * strerror(int)
, que parece crear una cadena entera nueva, no realiza ninguna asignación, porque el valor de retorno es en realidad una cadena asignada estáticamente. Las otras funciones pueden devolver un puntero a un bloque de memoria, pero este es en realidad uno de sus parámetros (por ejemplo, memcpy
). O devuelven un puntero al inicio de una memcmp
( memcmp
) o un entero que representa una comparación ( memcmp
).
Por otro lado, stdlib.h
tampoco es realmente acerca de la memoria. El diseño de stdlib.h
es para proporcionar operaciones de uso general que probablemente necesitará una gran cantidad de programas. Las funciones de memoria simplemente son ejemplos de tales operaciones fundamentales. Sin embargo, otras funciones como exit
y system
también son buenos ejemplos, pero no se aplican a la memoria.
Ahora hay algunas funciones en stdlib.h
que IMO podría haberse colocado en string.h
, particularmente las diversas funciones de conversión ( mbstowcs
, wcstombs
, atoi
, strtod
, etc.), y tal vez incluso las funciones bsearch
y qsort
. Estas funciones siguen los mismos principios que las funciones string.h
(operan en matrices, no devuelven bloques de memoria recién asignados, etc.).
Pero desde una perspectiva práctica, incluso si tenía mucho sentido combinar las funciones mem*
con las funciones malloc
, realloc
, calloc
y free
, la biblioteca estándar C nunca se reorganizará así. Tal cambio definitivamente rompería el código. Además, stdlib.h
y string.h
han existido por mucho tiempo, y son ambas bibliotecas útiles y fundamentales, que los cambios probablemente rompan la mayoría (o al menos, un montón) de código C.