utiliza que para c memset

que - ¿Por qué memset toma un int en lugar de un char?



para que se utiliza memset en c (3)

¿Por qué memset toma un int como segundo argumento en lugar de un char , mientras que wmemset toma un wchar_t lugar de algo como long o long long ?


Vea la respuesta de fred, es por razones de rendimiento.

Por mi lado, he probado este código:

#include <stdio.h> #include <string.h> int main (int argc, const char * argv[]) { char c = 0x00; printf("Before: c = 0x%02x/n", c); memset( &c, 0xABCDEF54, 1); printf("After: c = 0x%02x/n", c); return 0; }

Y me da esto en un Mac de 64 bits:

Before: c = 0x00 After: c = 0x54

Entonces, como ves, solo se escribe el último byte. Supongo que esto depende de la arquitectura (endianness).


memset es anterior a (por poco) la adición de prototipos de funciones a C. Sin un prototipo, no puede pasar un char a una función - cuando / si lo intentas, será promovido a int cuando lo pases, y lo que la función recibe es un int .

También vale la pena señalar que en C, un carácter literal como ''a'' no tiene el tipo char , tiene el tipo int , por lo que lo que pase generalmente comenzará como int . Esencialmente, la única forma de que se inicie como un personaje y se promueva es si se pasa una variable.

En teoría, memset probablemente podría modificarse para que reciba un char lugar de un int , pero es poco probable que haya algún beneficio, y una posibilidad bastante decente de romper un código antiguo u otro. Con un costo desconocido pero potencialmente bastante alto, y casi sin posibilidad de obtener ningún beneficio real, diría que las posibilidades de que se modifique para recibir un char caen en la línea entre "delgado" y "ninguno".

Editar (respondiendo a los comentarios): Los CHAR_BIT menos significativos de CHAR_BIT del int se utilizan como el valor para escribir en el destino.


Probablemente la misma razón por la que las funciones en <ctypes.h> toman <ctypes.h> y no chars .

En la mayoría de las plataformas, un char es demasiado pequeño para ser empujado en la pila por sí mismo, por lo que generalmente se empuja el tipo más cercano al tamaño de palabra de la máquina, es decir, int .

Como lo señala el enlace en el comentario de @ Gui13 , hacerlo también aumenta el rendimiento.