¿Cuál es el uso del valor de retorno de memset ()?


90

memset()se declara para devolver void*que siempre es el mismo valor que la dirección pasada a la función.

¿Cuál es el uso del valor de retorno? ¿Por qué no vuelve void?



2
¿Cuál es el uso del valor de retorno de strcat()? A veces, las funciones estándar son lo que se especifica que son, no lo que deberían ser.
DevSolar

4
@MatthieuM .: Además, generalmente hay un costo distinto de cero asociado con la devolución de cosas. Incluso si el valor de retorno cabe en un registro, generalmente necesita cargar ese valor en el registro. Esto tiene un costo, por pequeño que sea.
NPE

15
@sharptooth: Una función de "matar a todos los humanos" devolvería el número de humanos muertos, por supuesto.
indiv

2
@MatthieuM .: No te preocupes por esas trivialidades, pero yo ciertamente podría. ¿Qué pasa si estoy escribiendo un compilador para un sistema de recursos limitados? ¿Hmmm?
Thomas Eding

Respuestas:


36

La firma está en línea con todas las otras funciones similares: memcpy(), strcpy()etc. Siempre pensé que esto se hizo para permitir a uno a las llamadas a la cadena de tales funciones, y que de otro modo utilizar este tipo de llamadas en las expresiones.

Dicho esto, nunca me he encontrado con una situación del mundo real en la que me sienta obligado a utilizar el valor de retorno de esa manera.


122

Puede usarse para el encadenamiento de llamadas como:

char a[200];
strcpy(memset(a, 0, 200), "bla");

9
Sí, definitivamente es el caso de uso de 'encadenamiento'.
Cartesius00

6
He votado a favor de la respuesta porque es un caso interesante. Pero en la vida real, creo que es mejor mantener separadas las llamadas de memset y strcpy.
Tsvetomir Dimitrov

26
A los programadores de C les encanta el código ilegible, por lo que permitir el encadenamiento infinito es imprescindible al diseñar una función estándar.
Chad Schouggins

@ChadSchouggins Lea algo de código haskell y sabrá que los programadores en C son realmente bastante textuales;) (piensa en el "operador" de
expresiones regulares

Por supuesto, en este ejemplo habría tenido más sentido incluso, al revés, para strcpydevolver el puntero más allá del último copiado. memset(my_strcpy(a, "bla"), 0, a + 200);(como std::copy_ny std::fill_nhacer en C ++).
alfC

12

Para usar la función como argumento para otra función como sprintf


1

Me encontré con esta pregunta cuando busqué en Google para ver qué devolvía Memset.

Tengo un código en el que pruebo un valor, luego, si eso es cierto, pruebe para ver si un valor es ceros.

Debido a que no hay una forma completamente portátil en C para probar ceros, tengo que ejecutar Memset en el medio.

Entonces mi código es:

if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )

Esto habla del propósito de encadenamiento enumerado en las preguntas anteriores, pero es un ejemplo del uso de esta técnica.

Dejaré que otros juzguen si esta es una buena codificación o no.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.