Actualmente estoy reprogramando algunas bibliotecas C. Entonces mi pregunta es: ¿Por qué memchr toma un puntero const void *s y no simplemente un puntero de carácter?
Veo que probablemente podría buscar otras cosas, pero la función se llama literalmente memchr , entonces, ¿por qué usar un puntero vacío?
¡Gracias por adelantado!
El desarrollo temprano de C involucró una buena cantidad de tratar las cosas como bytes individuales y permitir a los programadores acceder a los bytes que representaban objetos. El nombre memchr refleja esa historia y no se puede cambiar fácilmente ahora.
void se agregó al lenguaje para proporcionar un tipo que representa, en cierto sentido, "algo está ahí, pero esto es flexible". El primer parámetro de memchr tiene el tipo const void * porque la rutina se puede usar para buscar un byte en cualquier tipo de objeto, no necesariamente en un objeto que es principalmente una matriz de caracteres.
Es la misma razón por la que otras funciones declaradas en string.h usan void* : para evitar una conversión.
Tal vez tengas razón, el nombre es engañoso, especialmente considerando que es parte de string.h . Por otra parte, también lo es memmove , memcmp , memset , etc...
Antes de que se introdujera el tipo de datos void en el estándar de 1989 ( -std=c89 ), funciones como memchr() solían tomar const char * , porque era lo más parecido a un puntero genérico en ese momento.
Si const char * estuvo presente hoy, deberá convertir de x * a const char * .
También puedes entender esto usando analogía:
strcpy() -> copia de cadenamemcpy() -> copia de memoria (binaria)